昨天的 promisify
函式預設傳入函式的 callback 一定是接收兩個參數 (error, result)
,但也有可能會有多個參數的情況:callback(err, res1, res2, ...)
。因此 promisify
可以改寫成:
promisify(f)
,f
的 callback 是原本只有兩個參數的版本,成功時就傳出一個結果。promisify(f, true)
,f
的 callback 有多個參數,成功時會以陣列回傳所有結果。function promisify(f, manyArgs = false) {
return function (...args) {
return new Promise((resolve, reject) => {
function callback(err, ...results) { // ...其餘所有參數
if (err) {
reject(err);
} else {
// 以 manyArgs 判斷數量
resolve(manyArgs ? results : results[0]);
}
}
args.push(callback);
f.call(this, ...args);
});
};
}
// 使用
f = promisify(f, true);
f(...).then(arrayOfResults => ..., err => ...);
雖然實際上 callback 函式還可能有別種變化,例如沒有錯誤參數,或是會呼叫 callback 多次、不適用於只能 resolve 一次的情境,但 promisify
可以比較一下從 callback-based 到 promise-based 的結構變化。