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

手写Promise,1.3promise中then方法的多次调用

时间:2023-04-03 17:35:39 Node.js

promise有一个很重要的特点就是同一个promise对象下的then方法可以被多次调用。例如测试代码修改如下:constMyPromise=require('./mypromise');letpromise=newMyPromise((resolve,reject)=>{resolve('---success----');//setTimeout(()=>{//resolve('success')//},3000)//reject("---failed----");})promise.then(value=>{console.log(value);},reason=>{console.log(reason)})promise.then(value=>{console.log(value);},reason=>{console.log(reason)})promise.then(value=>{console.log(value);},reason=>{console.log(reason)})如果是同步代码,这里没什么大问题,因为状态已经改变了,代码会向下执行,但是如果有一个异步代码,或者有多个异步代码。此时的状态无法存储。在前面的then方法中,successCallback和failedCallback只是简单地赋值。此处需要进行更改。它们的类型需要改成数组,以便以后存储。在resolve方法和reject方法中,需要判断数组长度是否为0,如果数组中还有元素,则弹出第一个执行。数组长度为0。//成功回调successCallback=[];//失败回调failedCallback=[];resolve=value=>{//如果状态不是waiting,则阻止程序往下走if(this.status!==PENDING)return//改变状态为successfulthis.status=FULFILLED//保存成功的值this.value=值;//判断成功回调是否存在,存在则调用//this.successCallback&&this.successCallback(this.value);while(this.successCallback.length){this.successCallback.shift()(this.value);}}reject=reason=>{//如果状态不是waiting,防止程序宕机if(this.status!==PENDING)return//改变状态为失败this.status=REJECTED//保存失败原因this.reason=reason;//判断失败回调是否存在,存在则调用//this.failedCallback&&this.failedCallback(this.reason);while(this.failedCallback.length){this.failedCallback.shift()(this.reason);}}then方法也需要改一下then(successCallback,failedCallback){//状态判断if(this.status===FULFILLED){successCallback(this.value)}elseif(this.status===REJECTED){failedCallback(this.reason)}else{//等待,需要存储成功回调和失败回调,等待执行后再执行this.successCallback.push(successCallback);this.failedCallback.push(failedCallback);}}测试代码test,3秒后连续输出success,测试成功