当前位置: 首页 > 后端技术 > Node.js

从零手写一步步实现承诺

时间:2023-04-04 01:03:58 Node.js

昨天看了PeterTanJinjie分享的文章,手写从零开始,逐步实现PromiseA+标准的所有方法。感谢您的分享。我试图实现一个乞丐版本。pushcatch方法的实现,catch参数作为入栈的回调函数核心思想2:链式调用的实现只需要返回this、Jquery、Zepto源码即可。完整代码如下:classHackPromise{constructor(fn){this.status=this.PROMISE_STATUS.PENDING;这个.onFulfilledStack=[];this.onRejectedStack=[];fn(this.onResolve,this.onReject);}PROMISE_STATUS=Object.freeze({PENDING:'pending',FULFILLED:'fulfilled',REJECTED:'rejected'});staticresolve=value=>newHackPromise(resolve=>resolve(value));staticreject=error=>newHackPromise((resolve,reject)=>reject(error));staticall=promiseArr=>{constpromiseArrLength=promiseArr.length;constpromiseResArr=[];让promiseResArrEnd=false;returnnewHackPromise((resolve,reject)=>{for(leti=0;i{if(promiseResArrEnd){return;}promiseResArr[i]=res;if(promiseResArr.filter(promiseRes=>promiseRes).length===promiseArrLength){promiseResArrEnd=真;解析(promiseResArr);}}).catch(e=>{如果(promiseResArrEnd){返回;}promiseResArrEnd=true;拒绝(e);});}});};staticrace=promiseArr=>{让promiseResArrEnd=false;returnnewHackPromise((resolve,reject)=>{for(leti=0;i{if(promiseResArrEnd){return;}promiseResArrEnd=true;resolve(res);}).catch(e=>{if(promiseResArrEnd){return;}promiseResArrEnd=true;reject(e);});}});};onResolve=value=>{if(this.status===this.PROMISE_STATUS.PENDING){setTimeout(()=>{this.status=this.PROMISE_STATUS.FULFILLED;this.onFulfilledStack.forEach(cb=>cb(value));},0);}返回这个;};onReject=error=>{if(this.status===this.PROMISE_STATUS.PENDING){setTimeout(()=>{this.status=this.PROMISE_STATUS.REJECTED;this.onRejectedStack.forEach(cb=>cb(error));},0);}返回这个;};then=onFulfilled=>{if(this.status===this.PROMISE_STATUS.PENDING){this.onFulfilledStack.push(onFulfilled);}返回这个;};catch=onRejected=>{if(this.status===this.PROMISE_STATUS.PENDING){this.onRejectedStack.push(onRejected);}返回这个;};}

最新推荐
猜你喜欢