Promise

Promise

中等

簡介

在Promise類別出現之前,處理非同步程式碼只有一種方式:回呼模式。

回呼函式是一種函式,它會當作引數傳給另一個函式,並在另一個函式完成某個動作後被呼叫。這類回呼函式常見的模式,是把「錯誤」當作第一個參數(見下方範例)。

function callback(error, arg2, arg3) {}

這跟非同步程式碼有什麼關係?

長久以來,回呼的用途是讓我們能在非同步工作完成後做一些事,而且不會阻塞整個程式。

fetchProduct(productId, function (error, data) {
  if (error) {
    // Handle the error
  } else {
    // Do some work
  }
});

在上面的範例中,fetchProduct函式(它是一個非同步函式)會接收一個回呼函式作為第二個引數,用來決定產品資料取得之後要做什麼。

說明

這個練習有兩個目標:

  1. 實作一個 promisify 函式,把使用「回呼模式」的函式轉換成會回傳 Promise 的函式。請參考下面的範例。
function fetchProduct(productId, function(error, data) {
    if (error) {
        // Handle the error
    } else {
        // Make something with your data
    }
})

const fetchProductAsPromise = promisify(fetchProduct);

// Now you got a function `fetchProductAsPromise`
// that returns a promise
fetchProductAsPromise(productId)
    .then((data) => {})
    .catch((error) => {});
  1. 重新實作以下 Promise 的內建方法(但不能使用它們本身)
  • all:接收一個 promise 陣列,當_全部_ promise 都 resolve 時就 resolve,只要其中_一個_ reject 就 reject。
  • allSettled:接收一個 promise 陣列,當_全部_ promise 無論是 resolve 還是 reject 都完成時就 resolve。
  • race:接收一個 promise 陣列,並以_第一個_ resolve 或 reject 的 promise 的結果來 resolve 或 reject。
  • any:接收一個 promise 陣列,當其中_一個_ promise resolve 時就 resolve,當_全部_ promise 都 reject 時就 reject。
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
JavaScript Exercism

準備好開始 Promise 了嗎?

註冊 Exercism,透過 37 個概念159 個練習 和真人引導來學習並精通 JavaScript,全部免費。