手写Promise


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>promise</title>
  </head>
  <body></body>
  <script>
    function Promise(exector) {
      let self = this;
      this.status = 'pending';
      this.catchCallbacks = [];
      this.suceeseCallbacks = [];
      this.value = '';
      this.reson = '';

      function resolve(value) {
        self.value = value;
        self.status = 'resolve';
        console.log("resolve");
        self.suceeseCallbacks.forEach(element => {
          var returnvalue = element(self.value);
          returnvalue && (self.value = returnvalue);
        });
      }
      function reject() {
        self.status = 'reject';
        self.catchCallbacks.forEach(element => {
          var returnvalue = element(self.reson);
          returnvalue && (self.reson = returnvalue);
        });
      }
      try {
        exector(resolve, reject);
      } catch (e) {
        reject(e);
      }
    }
    // let p = new Promise((resolve, reject) => {
    //   console.log("pending");
    //   setTimeout(() => {
    //     resolve("成功");
    //   }, 1000);
    // });
    Promise.prototype.then = function(then, err) {
      // console.log(this.suceeseCallbacks);

      this.catchCallbacks.push(err);
      this.suceeseCallbacks.push(then);
      if (this.status === 'resolve') {
        then(this.value);
      }

      return this;
    };
    Promise.prototype.catch = function(err) {
      this.catchCallbacks.push(err);
      if (this.status === 'reject') {
        err(this.reson);
      }
      return this;
    };
    // p.then(res => {
    //   console.log("then", "res", res);
    // });
    Promise.all = function(arr) {
      console.log(arr);
      return new Promise(function(resolve, reject) {
        let count = 0;
        var result = [];
        // resolve([12, 321]);
        arr.forEach((item, index) => {
          console.log(index);
          item.then(function(res) {
            result[index] = res;
            count++;
            console.log(count === arr.length, arr.length, result, count);
            // console.log('forEach resolve');
            if (count == arr.length) {
              console.log('forEach resolve');
              resolve(result);
              // console.log('forEach resolve');
            }
          });
        });
      });
    };
    var p = new Promise(function(resolve, reject) {
      setTimeout(() => {
        resolve(12);
      }, 1000);
    });
    // p.then(res => {
    //   console.log(res, 'res')
    // })
    Promise.all([p, p, p, p])
      .then(res => {
        console.log(res, 'allres');
      })
      .catch(err => {
        console.log(err);
      });
  </script>
</html>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值