純前端頁面,程式碼只在你的瀏覽器執行

2. 實作你自己的 MyPromise

medium JavaScript Promise async 建議 30 分鐘

下面的 sleep() 用的不是原生 Promise,而是自己實作的 MyPromise。呼叫端維持原樣,awaitthencatch 都要能用。

function sleep(sec) {
  return new MyPromise((resolve, reject) => {
    setTimeout(() => {
      resolve(sec);
    }, sec * 1000);
  });
}

await sleep(2);

sleep(2).then(funcThen).catch(funcCatch);

下面是一份寫到一半的草稿,請把它補完。

class MyPromise {
  constructor(func) {
    let resolve = (val) => {
      this.resolverFunc && this.resolverFunc(val)
    }
    function reject(err) {
      throw new Error(err);
    }
    func(resolve, reject);
  }
  then(func1) {
    this.state = 'resolved';
    this.resolverFunc = func1;
  }
  catch(func2) {
  }
}

驗收標準

測試

右邊編輯器附了四段測試。A 段可以直接執行,B、C、D 預設註解起來,完成後四段都要能通過。

預期輸出

+    0ms  C: caught boom
+    0ms  D: sync
+ 1000ms  A: awaited 1s
+ 3000ms  B: total 3s
solution.js
Console 尚未執行
按「執行」開始,輸出會標示相對時間,方便確認真的等了 2 秒。