# 实现一个简单的 Promise

function myPromise(excutor) { // 构造
  var self = this // 保存 this 指向
  self.onResolvedCallback = [] // Promise resolve 时的回调函数

  function resolve(value) {
    setTimeout(() => { // promise 的 then 函数需要异步执行
      self.data = value // 直接往实例上挂个 data
      self.onResolvedCallback.forEach(callback => callback(value)) // 取出 onResolvedCallback 数组里的函数依次执行一遍
    })
  }
  excutor(resolve.bind(self)) // 执行传入的 resolve 函数
}

myPromise.prototype.then = function (onResolved) {
  // 保存上下文,哪个 promise 调用的 then,就指向哪个 promise
  var self = this
  // 一定要返回一个新的 promise
  return new myPromise(resolve => {
    self.onResolvedCallback.push(function () {
      var result = onResolved(self.data)
      if (result instanceof myPromise) { // 如果返回值还是一个 promise
        result.then(resolve) // 继续交给返回值处理
      } else {
        resolve(result) // 如果返回值不是 promise,直接 resolve
      }
    })
  })
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Last Updated: 5/6/2020, 11:48:16 AM