简易版
实现了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;
作者:Mr无愧于心
链接:https://www.jianshu.com/p/44a971659696
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦