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

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

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

      Promise-all方法實現

      Promise 的 all 靜態方法特點

      • all 方法會返回一個新的 Promise 對象
      • 會按照傳入數組的順序將所有 Promise 中成功返回的結果保存到一個新的數組返回
      • 數組中有一個 Promise 失敗就會失敗, 只有所有成功才會成功

      博主這里就廢話不多說直接上代碼了:

      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);
                  });
              }
          });
      }
      

      完整的代碼如下:

      index.html

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>promise-all方法實現</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);
                          });
                      }
                  });
              }
          }
      </script>
      <script>
          let p1 = new MyPromise(function (resolve, reject) {
              // resolve("111");
              reject("aaa");
          });
          let p2 = new MyPromise(function (resolve, reject) {
              setTimeout(function () {
                  resolve("222");
              }, 5000);
          });
          let p3 = new MyPromise(function (resolve, reject) {
              setTimeout(function () {
                  resolve("333");
              }, 3000);
          });
      
          let pp = MyPromise.all([p1, p2, p3]);
          console.log(pp);
          pp.then(function (result) {
              console.log("成功", result);
          }, function (err) {
              console.log("失敗", err);
          });
      </script>
      </body>
      </html>
      
      posted @ 2022-03-01 23:28  BNTang  閱讀(91)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日韩精品无码去免费专区| 一个人看的www视频免费观看| 中文国产人精品久久蜜桃| 精品一区二区三区在线播放视频| 少妇高潮毛片免费看| 亚洲综合一区国产精品| 亚洲日本VA中文字幕在线| 国产成人精品无人区一区| 国产久免费热视频在线观看| 日韩一区在线中文字幕| 亚洲v欧美v日韩v国产v| 福利视频一区二区在线| 一区二区三区四区亚洲自拍| 亚洲综合一区二区三区不卡| 内射老阿姨1区2区3区4区| 欧美、另类亚洲日本一区二区| 久久av色欲av久久蜜桃网| 亚洲中文久久久精品无码| 亚洲欧美牲交| 视频免费完整版在线播放| 涪陵区| 精品无码三级在线观看视频 | 高潮射精日本韩国在线播放| 欧美成人午夜在线观看视频| 国产中文字幕精品喷潮| 日韩黄色av一区二区三区| 茄子视频国产在线观看| 欧美性猛交xxxx乱大交丰满| 东京热一精品无码av| 亚洲小说乱欧美另类| 欧美特级午夜一区二区三区| 国产亚洲一区二区三区成人| 国语自产精品视频在线看| 日韩精品中文字幕有码| 亚洲精品第一区二区在线| 枝江市| 亚洲国产欧美在线人成| 幻女free性俄罗斯毛片| 精品久久精品午夜精品久久 | 国产360激情盗摄全集| 性色a码一区二区三区天美传媒|