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

全部代码

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 实现 - 没有考虑异常处理(也是为了自己能更好的理解 Promise))