iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0
自我挑戰組

JS 加強筆記系列 第 24

Day 24:promise 實作 (2)

  • 分享至 

  • xImage
  •  

chaining

接下來加入的是鏈接功能,也就是 then 要可以:

  • 回傳一個 promise pp 會以 onFulfilledonRejected 回傳的值 resolve。
  • 如果沒有 onFulfilledonRejected,就把它們本來會接到的值傳給 p

這是改變後的 then 方法:

then(onFulfilled, onRejected) {
    const returnValue = new Promise(); // (A)
    const self = this;

    let fulfilledTask;
    if (typeof onFulfilled === 'function') {
        fulfilledTask = function () {
            const r = onFulfilled(self.promiseResult);
            returnValue.resolve(r); // (B)
        };
    } else {
        fulfilledTask = function () {
            returnValue.resolve(self.promiseResult); // (C)
        };
    }

    let rejectedTask;
    if (typeof onRejected === 'function') {
        rejectedTask = function () {
            const r = onRejected(self.promiseResult);
            returnValue.resolve(r); // (D)
        };
    } else {
        rejectedTask = function () {
            returnValue.reject(self.promiseResult); // (E)
        };
    }
    ···
    return returnValue; // (F)
}

首先,then 會建立和回傳一個新的 promise (A、F)。另外,原本的成功或失敗的處理只是執行 onFulfilled(result) 或 onRejected(result),現在改成

  • 成功時,promise 會 resolve onFulfilled(result) 的結果 (B)。或在缺少 onFulfilled 時,直接傳出成功結果 (C)。
  • 失敗時,promise 會 resolve onRejected(result) 的結果 (D,另外特別注意這裡也是 resolve 不是 reject)。或在缺少 onRejected 時,直接傳出失敗結果 (E)。

上一篇
Day 23:promise 實作 (1)
下一篇
Day 25:promise 實作 (3)
系列文
JS 加強筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言