承諾連結

then 一個承諾的方法返回一個新的承諾。

const promise = new Promise(resolve => setTimeout(resolve, 5000));

promise
    // 5 seconds later
    .then(() => 2)
    // returning a value from a then callback will cause
    // the new promise to resolve with this value
    .then(value => { /* value === 2 */ });

then 回撥中返回 Promise 會將其附加到 promise 鏈。

function wait(millis) {
    return new Promise(resolve => setTimeout(resolve, millis));
}

const p = wait(5000).then(() => wait(4000)).then(() => wait(1000));
p.then(() => { /* 10 seconds have passed */ });

一個 catch 允許被拒絕的承諾恢復,類似於 try / catch 語句中的 catch 如何工作。任何連結 then 一個後 catch 將使用從解決價值執行其決心處理 catch

const p = new Promise(resolve => {throw 'oh no'});
p.catch(() => 'oh yes').then(console.log.bind(console));  // outputs "oh yes"

如果鏈中間沒有 catchreject 處理程式,則最後的 catch 將捕獲鏈中的任何拒絕:

p.catch(() => Promise.reject('oh yes'))
  .then(console.log.bind(console))      // won't be called
  .catch(console.error.bind(console));  // outputs "oh yes"

在某些情況下,你可能希望分支函式的執行。你可以根據條件從函式返回不同的 promise。稍後在程式碼中,你可以將所有這些分支合併為一個以呼叫其上的其他函式和/或在一個位置處理所有錯誤。

promise
    .then(result => {          
        if (result.condition) {
            return handlerFn1() 
                .then(handlerFn2);
        } else if (result.condition2) {
            return handlerFn3()
                .then(handlerFn4);
        } else {
            throw new Error("Invalid result");
        }
    })
    .then(handlerFn5)
    .catch(err => {
        console.error(err);
    });

因此,函式的執行順序如下:

promise --> handlerFn1 -> handlerFn2 --> handlerFn5 ~~> .catch()
         |                            ^
         V                            |
         -> handlerFn3 -> handlerFn4 -^            

單個 catch 將在可能發生的任何分支上得到錯誤。