美文网首页让前端飞程序员
最简 Promise 实现 - 没有考虑异常处理(也是为了自己能

最简 Promise 实现 - 没有考虑异常处理(也是为了自己能

作者: 熙沫 | 来源:发表于2016-10-21 11:45 被阅读0次

    全部代码

    function Promise_c(func) {
      this._then = []
      this._catch = function (err) {
        throw err
      }
      func(this.resolve.bind(this), this.reject.bind(this))
      return this
    }
    
    Promise_c.prototype.resolve = function (res) {
      if (this._then.length) {
        var func = this._then.shift()
        var next = func(res)
        if (next instanceof Promise_c) {
          next._then = [].concat(next._then, this._then)
        } else {
          this.resolve(next)
        }
      }
    }
    
    Promise_c.prototype.reject = function (err) {
      this._catch && this._catch(err)
    }
    
    Promise_c.prototype.then = function (func) {
      this._then.push(func)
      return this
    }
    
    Promise_c.prototype.catch = function (func) {
      this._catch = func
      return this
    }
    
    if (next instanceof Promise_c) {
      next._then = [].concat(next._then, this._then)
    }
    

    这行代码是核心, 如果上一个 then 返回的是 Primise 实例
    就讲 当前Promise下所有未执行的 then 函数 全部移交给 next 的 Promise 实例
    这时当前 Promise的任务已经完成

    new Promise_c(function (resolve, reject) {
      setTimeout(function () {
        resolve('hello :1')
      }, 2000)
    }).then(function (res) {
      console.log(res, 1)
      // hello :1 1
      return new Promise_c(function (resolve, reject) {
        setTimeout(function () {
          resolve(res + ':' + 2)
        }, 2000)
      })
    }).then(function (res) {
      console.log(res, 2)
      // hello :1:2 2
    })
    
    new Promise_c(function (resolve, reject) {
      setTimeout(function () {
        resolve('hello :1')
      }, 2000)
    }).then(function (res) {
      console.log(res, 1)
      // hello :1 1
      return new Promise_c(function (resolve, reject) {
        setTimeout(function () {
          resolve(res + ':' + 2)
        }, 2000)
      }).then(function (res) {
        console.log(res, 2)
        // hello :1:2 2
      })
    })
    

    也就是说这两种调用的形式,最后被执行的结果是相同的,而且如果使用第一种写法(如果业务逻辑是如此)
    最后执行的时候回被转化成第二种形式

    相关文章

      网友评论

        本文标题:最简 Promise 实现 - 没有考虑异常处理(也是为了自己能

        本文链接:https://www.haomeiwen.com/subject/nwaquttx.html