Promise

語法

Promisearrow-up-right 物件代表一個即將完成、或失敗的非同步操作,以及它所產生的值。是用來優化非同步的語法

+// 語法
new Promise( /* executor */ function(resolve, reject) { ... } );

+// 範例
const myFirstPromise = new Promise((resolve, reject) => {
  // *執行一些非同步作業,最終呼叫:
  //   resolve(someValue); // 實現
  // 或 //注意識貨
  //   reject("failure reason"); // 拒絕
});
  • 為一個依序接收兩個參數的函式:resolvereject(實現及拒絕回呼函式)

  • *通常 executor 函式會發起一些非同步操作

  • 成功完成後執行 resolve 以完成 promise;或如果有錯誤,執行 rejects。 如果 executor 函式在執行中拋出錯誤,promise 會被拒絕(rejected),回傳值也將被忽略。

  • then((successMessage) 僅作為成功訊息,但是它不一定是字串

  • 不管是 resolve 還是 reject,任何一個被觸發後,就會跳脫出 Promise,所以後面的 resolve 或是 reject,就會被省略掉

基本範例

  • 第二個then為接收上一個then的return, 注意如果第一個忘了retrun 這邊接收到的東西就是undefined,不會有任何錯誤。

  • 由於 Promise.prototype.then() 以及 Promise.prototype.catch() 方法都回傳 promise,它們可以被串接。

  • 但如果我們在 .then 中是 return 另一個 new Promise ,則下一個 .then 會等到這個 Promise 中的 resolve 得到值後才執行。且在下一個 .thenresolvedCallback 中,可以得到上一個 new Promiseresolve 的值

circle-exclamation

範例: 帶入參數回傳Promise

  • 在then中回傳 new Promise 來達成一個執行完後再一個的行為 [來解callbakhall]

  • 下列程式碼可以在更加優化去寫成async await寫法

Promise.all

此方法在聚集(aggregating)多個 promises 的結果時很有幫助。

  • 一個 iterable 物件像是 ArrayString。回傳一個以 iterable 其內所有值(包含非 promise 值)

  • 當任一個陣列成員被拒絕則 Promise.all 被拒絕。例如,若傳入四個將在一段時間後被解決的 promises,而其中一個立刻被拒絕,則 Promise.all 將立刻被拒絕。

其中一個拒絕範例

  • 其中一個立刻被拒絕,則 Promise.all 將立刻被拒絕。 「就算全部都被拒絕,也是回一個」

Promise.race

當傳入的 iterable 中有 promise 被實現或拒絕時,立刻回傳被實現或拒絕的 Promise

參考

Last updated