极简实现系列 是用最简单的代码实现一些常见的方法,目的是为了帮助理解原理,所以并没有考虑太多限制条件
先看下Promise的简单用法:
const p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve()
}, 1000)
})
p.then(res => {
console.log('过了1秒')
})
我们来简单分析一下流程:
- Promise构造方法传入一个函数executor,在new Promise的时候就执行
- executor内部的异步任务放入队列,等待执行
- then方法执行后,收集成功/失败任务,放入成功/失败队列
- executor异步任务被执行,触发resolve/reject,从成功/失败队列取出任务执行
根据这些,就可以大致的写出一个promise的形状了 :
class myPromise{
// 传入一个executor函数
constructor(executor) {
this.resolveArr = [] // 成功队列
this.rejectArr = [] // 失败队列
let resolve = (val) => {
// 从成功队列里依次取出回调
while(this.resolveArr.length) {
let cb = this.resolveArr.shift()
cb(val)
}
}
// reject 同理
let reject = (val) => {
// 从成功队列里依次取出回调
while(this.resolveArr.length) {
let cb = this.rejectArr.shift()
cb(val)
}
}
// 最后执行executor
executor(resolve, reject)
}
// then方法接受成功和失败回调,并push进相应的队列
then(resolve, reject) {
this.resolveArr.push(resolve)
}
}
我们来测试一下
const p2 = new myPromise((resolve, reject) => {
setTimeout(() => {
resolve()
}, 1000)
})
p2.then(res => {
console.log('过了1秒')
})
1秒后【过了1秒】成功打印出来了
以上就是一个超低配版的Promise了,是不是挺简单的。当然要完整的实现Promise的功能还要考虑非常多的情况,要遵从ES6的Promise A+规范等,有兴趣的同学自行去找其他资料啦,我的水平有限,只能写到这了~~