文章目的
介紹 Promise Chain 運作邏輯,以及較進階的用法。
Promise Chain
Promise Chain 就是執行 Promise 的鏈接概念,在 Promise - 如何運用 Promise 處理非同步事件中有簡單提到 Promise 解決了 call back hell 的困境,那其實用上的就是 Promise 的鏈接方法。
這邊我們來了解一下 Promise Chain 一些的使用邏輯,先來看看範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| function fn (n) { return new Promise ((resolve, reject) => { setTimeout(() => { if (n) { resolve('success') } else { reject('fail') } }, 0) }) }
fn (1) .then((res) => { console.log('success:', res) return fn (2) }) .then((res) => { console.log('success2:', res) return fn (3) }) .then((res) => { console.log('success3:', res) }) .catch((err) => { console.log('error:', err) })
|
上面的範例就是一個簡單的 Promise Chain,fn
透過 then
接收成功的結果,並在得到結果後,透過 return
繼續執行 fn
,在上面執行三次 fn
後,我們可以得到完整的三個執行成功結果,但如果我們把程式碼變成下面這樣又會如何呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| fn (1) .then((res) => { console.log('success:', res) return fn (0) }) .then((res) => { console.log('success2:', res) return fn (3) }) .then((res) => { console.log('success3:', res) }) .catch((err) => { console.log('error:', err) })
|
執行結果會變成成功結果只有一次,然後出現 error
的結果,原因是我們執行 fn(1)
時沒有問題,但是在執行第二次時我們傳入 0 導致 Promise 回傳錯誤,當錯誤一回傳 Promise 就會停下後續的執行。
當出現錯誤後如果想要繼續執行鏈接其實也是可以的,我們只需在 catch
底下 return
新的 Promise 執行即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| fn (1) .then((res) => { console.log('success:', res) return fn (0) }) .then((res) => { console.log('success2:', res) return fn (3) }) .then((res) => { console.log('success3:', res) }) .catch((err) => { console.log('error:', err) return fn (4) }) .then((res) => { console.log('success4:', res) })
|
上面的程式碼,我們一樣可以看到 fn (4)
的執行結果。
then 接收失敗結果
在前面說過用 then
接收成功的結果,但如果今天想要不管成功與否都繼續執行後續的 Promise 呢?
那就可以使用 then
來接收失敗結果達到需求,來看看範例:
1 2 3 4 5 6 7 8 9 10 11
| fn (1) .then((res) => { console.log('success:', res) return fn (2) }, (err) => { console.log('error:', err) return fn (3) }) .then((res) => { console.log('message2:', res) })
|
上面的範例可以看到 then
裡面我們傳入了第二個 call back function,第一個 call back function 是接收成功的結果,第二個是接收失敗的結果,透過這樣的寫法無論是成功或是失敗都可以繼續執行後續的 Promise 囉!
相關連結
Promise - 如何運用 Promise 處理非同步事件
Promise - Promise 運作概念
Promise - Promise 使用方法
參考資料
六角學院-JavaScript核心篇