在Promise類別出現之前,處理非同步程式碼只有一種方式:回呼模式。
回呼函式是一種函式,它會當作引數傳給另一個函式,並在另一個函式完成某個動作後被呼叫。這類回呼函式常見的模式,是把「錯誤」當作第一個參數(見下方範例)。
function callback(error, arg2, arg3) {}
這跟非同步程式碼有什麼關係?
長久以來,回呼的用途是讓我們能在非同步工作完成後做一些事,而且不會阻塞整個程式。
fetchProduct(productId, function (error, data) {
if (error) {
// Handle the error
} else {
// Do some work
}
});
在上面的範例中,fetchProduct函式(它是一個非同步函式)會接收一個回呼函式作為第二個引數,用來決定產品資料取得之後要做什麼。
這個練習有兩個目標:
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) => {});
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。