promise原理(一)
2018-07-23 本文已影响2人
Mr无愧于心
简易版
- 实现了promise的状态管理(padding->resolved)(padding->rejected)
- 实现了promise的then函数(公有属性)
- 实现了promise中对异步函数的处理(发布订阅)
- 实现了promise的参数传递(利用挂载到promise对象上实现value,reason共享)
- 实现了promise的异常捕捉(try--catch--reject)
- 没有实现链式调用(情况较多,难度系数较高)
- 没有实现catch错误处理
- 没有实现all,race,reject ,resolve等方法
//ES6定义promise构造函数
class Promise {
constructor(executor) {//私有属性
// 默认状态是等待态
this.status = 'pending';//初始状态padding
this.value = undefined;//
this.reason = undefined;//
// 存放成功的回调(订阅发布中的事件池,当promise中是异步的情况下,不能立即执行)
this.onResolvedCallbacks = [];
// 存放失败的回调(订阅发布中的事件池,当promise中是异步的情况下,不能立即执行)
this.onRejectedCallbacks = [];
let resolve = (data) => {
if (this.status === 'pending') {//只有等待状态才可以转化成成功状态
this.value = data;//把当前的值传递给promsie对象,,已便then函数中onFulFilled回调使用
this.status = 'resolved';//改变当前状态为resolved,且不能再次改变
this.onResolvedCallbacks.forEach(fn => fn());//当resolve函数执行时,执行成功事件池中的所有回调(订阅)
}
}
let reject = (reason) => {
if (this.status === 'pending') {//只有等待状态才可以转化成失败状态
this.reason = reason;//把失败的原因传递给promise对象,已便then函数中onRejected回调使用
this.status = 'rejected';//改变当前状态为rejected,且不能再次改变
this.onRejectedCallbacks.forEach(fn => fn());//当reject函数执行时,执行失败事件池中的所有回调(订阅)
}
}
try { // 执行时可能会发生异常
executor(resolve, reject);
} catch (e) {
reject(e); // promise失败了,直接调用reject函数,捕捉错误
}
}
then(onFulFilled, onRejected) { //公有属性 then 方法
//判断状态调用不同的处理函数
if (this.status === 'resolved') {//如果当前状态改变为resolved,那么就执行then的第一个回调,并传入this.value值
onFulFilled(this.value);
}
if (this.status === 'rejected') {//如果当前状态改变为rejected,那么就执行then的第二个回调,并传入失败原因this.reason
onRejected(this.reason);
}
// 当前既没有完成 也没有失败(说明resolve和reject都没有执行,在异步函数中)
if (this.status === 'pending') {
// 存放成功的回调(发布订阅中的订阅,当resolve执行时发布,执行所有的then中的onFulFilled)
this.onResolvedCallbacks.push(() => {
onFulFilled(this.value);
});
// 存放失败的回调(发布订阅中的订阅,当reject执行时发布,执行所有的then中的onRejected)
this.onRejectedCallbacks.push(() => {
onRejected(this.reason);
});
}
}
}
module.exports = Promise;