当前位置: 首页 > Web前端 > HTML5

从零手写一步步实现承诺

时间:2023-04-05 22:59:13 HTML5

昨天看了PeterTanJinjie分享的文章,手写从零开始,逐步实现PromiseA+标准的所有方法。感谢你的分享。我尝试实现了核心思想1的乞丐版:then方法的实现,then方法的参数作为回调函数。catch方法的实现入栈,catch的参数作为回调函数入栈。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);}返回这个;};}

最新推荐
猜你喜欢