<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Promise-race方法實現

      Promise 的 race 靜態方法特點

      • race 方法會返回一個新的 Promise 對象
      • 誰先返回就聽誰的

      博主實現代碼:

      static race(list) {
          return new MyPromise(function (resolve, reject) {
              for (let p of list) {
                  p.then(function (value) {
                      resolve(value);
                  }).catch(function (e) {
                      reject(e);
                  });
              }
          });
      }
      

      完整代碼如下:

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>promise-race方法實現</title>
      </head>
      <body>
      <script>
          // 定義常量保存對象的狀態
          const PENDING = "pending";
          const FULFILLED = "fulfilled";
          const REJECTED = "rejected";
      
          class MyPromise {
              constructor(handle) {
                  // 0.初始化默認的狀態
                  this.status = PENDING;
                  // 定義變量保存傳入的參數
                  this.value = undefined;
                  this.reason = undefined;
                  // 定義變量保存監聽的函數
                  // this.onResolvedCallback = null;
                  // this.onRejectedCallback = null;
                  this.onResolvedCallbacks = [];
                  this.onRejectedCallbacks = [];
                  // 1.判斷是否傳入了一個函數, 如果沒有傳入就拋出一個異常
                  if (!this._isFunction(handle)) {
                      throw new Error("請傳入一個函數");
                  }
                  // 2.給傳入的函數傳遞形參(傳遞兩個函數)
                  handle(this._resolve.bind(this), this._reject.bind(this));
              }
      
              then(onResolved, onRejected) {
                  return new MyPromise((nextResolve, nextReject) => {
                      // 1.判斷有沒有傳入成功的回調
                      if (this._isFunction(onResolved)) {
                          // 2.判斷當前的狀態是否是成功狀態
                          if (this.status === FULFILLED) {
                              try {
                                  // 拿到上一個promise成功回調執行的結果
                                  let result = onResolved(this.value);
                                  // console.log("result", result);
                                  // 判斷執行的結果是否是一個promise對象
                                  if (result instanceof MyPromise) {
                                      result.then(nextResolve, nextReject);
                                  } else {
                                      // 將上一個promise成功回調執行的結果傳遞給下一個promise成功的回調
                                      nextResolve(result);
                                  }
                              } catch (e) {
                                  nextReject(e);
                              }
                          }
                      }
                      // 1.判斷有沒有傳入失敗的回調
                      // if(this._isFunction(onRejected)){
                      try {
                          // 2.判斷當前的狀態是否是失敗狀態
                          if (this.status === REJECTED) {
                              let result = onRejected(this.reason);
                              if (result instanceof MyPromise) {
                                  result.then(nextResolve, nextReject);
                              } else if (result !== undefined) {
                                  nextResolve(result);
                              } else {
                                  nextReject();
                              }
                          }
                      } catch (e) {
                          nextReject(e);
                      }
                      // }
                      // 2.判斷當前的狀態是否是默認狀態
                      if (this.status === PENDING) {
                          if (this._isFunction(onResolved)) {
                              // this.onResolvedCallback = onResolved;
                              this.onResolvedCallbacks.push(() => {
                                  try {
                                      let result = onResolved(this.value);
                                      if (result instanceof MyPromise) {
                                          result.then(nextResolve, nextReject);
                                      } else {
                                          nextResolve(result);
                                      }
                                  } catch (e) {
                                      nextReject(e);
                                  }
                              });
                          }
                          // if(this._isFunction(onRejected)){
                          // this.onRejectedCallback = onRejected;
                          this.onRejectedCallbacks.push(() => {
                              try {
                                  let result = onRejected(this.reason);
                                  if (result instanceof MyPromise) {
                                      result.then(nextResolve, nextReject);
                                  } else if (result !== undefined) {
                                      nextResolve(result);
                                  } else {
                                      nextReject();
                                  }
                              } catch (e) {
                                  nextReject(e);
                              }
                          });
                          // }
                      }
                  });
              }
      
              catch(onRejected) {
                  return this.then(undefined, onRejected);
              }
      
              _resolve(value) {
                  // 這里是為了防止重復修改
                  if (this.status === PENDING) {
                      this.status = FULFILLED;
                      this.value = value;
                      // this.onResolvedCallback(this.value);
                      this.onResolvedCallbacks.forEach(fn => fn(this.value));
                  }
              }
      
              _reject(reason) {
                  if (this.status === PENDING) {
                      this.status = REJECTED;
                      this.reason = reason;
                      // this.onRejectedCallback(this.reason);
                      this.onRejectedCallbacks.forEach(fn => fn(this.reason));
                  }
              }
      
              _isFunction(fn) {
                  return typeof fn === "function";
              }
      
              static all(list) {
                  return new MyPromise(function (resolve, reject) {
                      let arr = [];
                      let count = 0;
                      for (let i = 0; i < list.length; i++) {
                          let p = list[i];
                          p.then(function (value) {
                              arr.push(value);
                              count++;
                              if (list.length === count) {
                                  resolve(arr);
                              }
                          }).catch(function (e) {
                              reject(e);
                          });
                      }
                  });
              }
      
              static race(list) {
                  return new MyPromise(function (resolve, reject) {
                      for (let p of list) {
                          p.then(function (value) {
                              resolve(value);
                          }).catch(function (e) {
                              reject(e);
                          });
                      }
                  });
              }
          }
      </script>
      <script>
          let p1 = new MyPromise(function (resolve, reject) {
              // resolve("111");
              reject("aaa");
          });
          let p2 = new MyPromise(function (resolve, reject) {
              setTimeout(function () {
                  resolve("222");
                  // reject("bbb");
              }, 5000);
          });
          let p3 = new MyPromise(function (resolve, reject) {
              setTimeout(function () {
                  resolve("333");
                  // reject("ccc");
              }, 3000);
          });
          MyPromise.race([p1, p2, p3]).then(function (value) {
              console.log("成功", value);
          }).catch(function (e) {
              console.log("失敗", e);
          });
      </script>
      </body>
      </html>
      
      posted @ 2022-03-01 23:29  BNTang  閱讀(95)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日韩精品区一区二区三vr| 精品国产一区二区三区av色诱| 2019国产精品青青草原| 国产欧美久久一区二区三区| 国产精一区二区黑人巨大| 亚洲av中文乱码一区二| 免费国产一级特黄aa大片在线| 亚洲欧美人成网站在线观看看| 亚洲精品国产自在现线最新| 国产精品久久久久AV福利动漫| 永靖县| 日韩在线观看 一区二区| 亚洲精品一区二区口爆| www内射国产在线观看| 国产精品一区二区三区性色| 一区二区三区精品不卡| 男女啪啪免费观看网站| 国内揄拍国内精品少妇国语| 精品九九热在线免费视频| 成A人片亚洲日本久久| 亚洲欧美综合一区二区三区| 国产蜜臀在线一区二区三区| 亚洲欧美成人a∨观看| 亚洲国产在一区二区三区| 亚洲精品区二区三区蜜桃| 猫咪网网站免费观看| 又湿又紧又大又爽A视频男| 风流老熟女一区二区三区| 久久精品国产99久久6| 无码人妻斩一区二区三区| 日本久久精品一区二区三区| 亚洲三级香港三级久久| 亚洲av成人一区二区三区| 99久久精品国产亚洲精品| 高清无码18| 日本无遮挡真人祼交视频| 久操热在线视频免费观看| 国产色视频一区二区三区qq号| 国产福利深夜在线播放| 中文字幕理伦午夜福利片| 久久人爽人人爽人人片av|