Promise重要知識點

IT學霸發表於2020-03-21

1、串聯 Promise

每次對 then() 或 catch() 的呼叫實際上建立並返回了另一個 Promise ,僅當前一個Promise 被完成或拒絕時,後一個 Promise 才會被決議。研究以下例子:

p1第一次呼叫then之後,會再次返回一個成功決議的Promise(即使p1是失敗的決議呼叫then之後也是返回成功決議的Promise)。之後每呼叫一次then,都會返回一個成功決議的Promise。

對一個Promise可以多次呼叫then進行成功或失敗的處理,而不會出現第一呼叫後就失效了。

2、錯誤捕獲

catch即可以處理reject結果還可以捕獲Promise執行器裡丟擲的錯誤。

Promise 序列鏈允許你捕獲前一個 Promise 的完成或拒絕處理函式中發生的錯誤

在此程式碼中, p1 的完成處理函式丟擲了一個錯誤,鏈式呼叫指向了第二個 Promise 上的
catch() 方法,能通過此拒絕處理函式接收前面的錯誤。若是一個拒絕處理函式丟擲了錯
誤,情況也是一樣。

為了確保能正確處理任意可能發生的錯誤,應當始終在 Promise 鏈尾部新增拒絕處理函式。

3、在 Promise 鏈中返回值

Promise 鏈的另一重要方面是能從一個 Promise 傳遞資料給下一個 Promise 的能力。傳遞給
執行器中的 resolve() 處理函式的引數,會被傳遞給對應 Promise 的完成處理函式,這點你
前面已看到過了。你可以指定完成處理函式的返回值,以便沿著一個鏈繼續傳遞資料。例
如:

p1 的完成處理函式在被執行時返回了 value + 1 。由於 value 的值為 42 (來自執行
器),此完成處理函式就返回了 43 。這個值隨後被傳遞給第二個 Promise 的完成處理函式,
並被其輸出到控制檯。
你能對拒絕處理函式做相同的事。當一個拒絕處理函式被呼叫時,它也能返回一個值。如果
這麼做,該值會被用於完成下一個 Promise 。

4、在 Promise 鏈中返回 Promise

從完成或拒絕處理函式中返回一個基本型別值,能夠在 Promise 之間傳遞資料,但若你返回
的是一個物件呢?若該物件是一個 Promise ,那麼需要採取一個額外步驟來決定如何處理。
研究以下例子:

在此程式碼中, p1 安排了一個決議 42 的作業, p1 的完成處理函式返回了一個已處於決議
態的 Promise : p2 。由於 p2 已被完成,第二個完成處理函式就被呼叫了。而若 p2 被
拒絕,會呼叫拒絕處理函式(如果存在的話),而不呼叫第二個完成處理函式。
關於此模式需認識的首要重點是第二個完成處理函式並未被新增到 p2 上,而是被新增到第
三個 Promise 。正因為此,上個例子就等價於:

若p2是一個reject結果,則p3只會被傳遞給拒絕處理函式,這與返回基本型別的值不同(基本型別的值永遠都會傳給成功處理函式)。

相關文章