1. 程式人生 > 實用技巧 >JavaScript的Promise必須要會的幾個點

JavaScript的Promise必須要會的幾個點

1. Promise.resolve()立即將Promise視為成功,立即呼叫then中的語句。

2. Promise.then()語句中也可以包含一個新的Promise物件。

3. Promise.catch(console.error)即可將錯誤丟擲。

4. 除了上面一種方法外,還可以用then()中的第二個引數來處理錯誤。

來看下面一個例子:

const a = ()=>{
      new Promise(
            (resolve) = > {
                  setTimeout(()=>{
                        console.log('a');
                        resolve();      
                  }, 1e3
));
const b = ()=>{
      new Promise(
            (resolve) = > {
                  setTimeout(()=>{
                        console.log('b');
                        resolve();      
                  }, 1e3
));
const c = ()=>{
      new Promise(
            (resolve) = > {
                  setTimeout(()=>{
                        console.log('c');
                        reject('Oops!);      
                  }, 1e3
));
const d = ()=>{
      new Promise(
            (resolve) = > {
                  setTimeout(()=>{
                        console.log('d');
                        resolve();      
                  }, 1e3
));
// 下面開始呼叫
Promise.resolve()
.then(a)
.then(b)
.then(c)
.then(d)
.catch(console.error)
// 或者是下面這種捕捉錯誤的方式
Promise.resolve()
.then(a)
.then(b)
.then(c)
.then(d,()=>{console.log('c erred out but no big deal...')})
.catch(console.error) // 該步驟一般不會執行

如果要忽略c中發生的錯誤,讓呼叫鏈繼續執行,則可以在c所在的then中呼叫.catch()方法,如下:

Promise.resolve()
.then(a)
.then(b)
.then(() => {
      c().catch((error) => console.log('error ignored))
      }
)
.then(d)
.catch(console.error)

5. finally

Promise.resolve()
.then(a)
.then(b)
.then(c)
.then(d)
.catch(console.error)
.finally(()=>{console.log('always called')})

6. 最後要記住一點,Promise物件中resolve的值是不對外開放的,詳情可見https://www.cnblogs.com/zxd66666/p/13394479.html,因為Promise物件的任務就是封裝,最大的屬性就是隔離,所以外部不能獲取到內部的值,我曾困惑了一個月時間,嘗試各種方法把resolve的值拿出來,最後都失敗了。別信網上說的async await非同步操作取值,根本取不出來。最可能的方法就是把攜帶返回值的Promise物件返回出來,使用時繼續呼叫Promise的方法。