iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
自我挑戰組

JS 加強筆記系列 第 20

Day 19:promisification (2)

  • 分享至 

  • xImage
  •  

昨天的 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 的結構變化。


上一篇
Day 19:promisification (1)
下一篇
Day 21:async/ await (1)
系列文
JS 加強筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言