1.什么是promise2.自定义promise要理解什么是promise,我们先按照官方文档写一个promisepromise1=newPromise(function(success){success("Successful");},function(fail){//fail(“失败”);})console.log(promise1);constpromise2=newPromise((success,fail)=>{//promise2调用了失败的回调函数//success("succsee");fail("fail");})console.log(promise2);promise1.then(function(success){console.log("promise1:"+success);},functionfail(fial){console.log("promise1:"+fial);})promise2.then((success)=>{console.log("promise2:"+success);},(fail)=>{console.log("promise2:"+fail);},);在这段代码中,我定义了一个promise1和promise2的对象,并传入了两个回调函数,分别是success和fail函数。我们在浏览器中输入promise实例可以看到,promise的结构一般分为三部分,promise对象的状态分为三部分,1.状态开始状态0,成功状态1和失败state2,2.内置函数success和fail,3.原型方法then和catch3.流程图4.说明状态0的Promise对象可能会变为状态1,并传递一个值给对应的状态处理方法,否则它可能会成为故障状态(2)并传递失败信息。当其中任何一种情况发生时,都会调用Promise对象的then方法绑定的处理方法(callbackFun)(then方法包含两个参数:success和fail,都是Function类型。当Promise状态为1时,调用then的成功方法,当Promise状态为2时,调用then的失败方法,所以异步操作的完成与绑定处理方法没有竞争)关键代码`functionMunichPromise(callback){varself=this;self.promiseStats=READYFLAG;//状态的属性,调用成功时,改为1,调用失败时,改为1self.promiseValue=null;//回调时返回self.promiseCallbacks=[];//用户自定义的回调函数(比如ajax返回时,当用户成功时,会弹出成功提示,失败时会弹出失败提示)//结构为{"success":function,"fail":fial}//定义内置函数——成功回调(不暴露给用户)functionsuccess(value){//varself=this;self.promiseStats=SUCCESSFLAG;self.promiseValue=价值;setTimeout(()=>{if(self.promiseCallbacks.length>0){self.promiseCallbacks.forEach(item=>{item.successed(value);});}},1);}functionfail(reason){//定义内置函数——失败回调(不暴露给用户)//varself=this;self.promiseStats=FAILFLAG;self.promiseValue=原因;setTimeout(()=>{if(self.promiseCallbacks.length>0){self.promiseCallbacks.forEach(item=>{item.failed(reason);});}},1);}回调(成功,失败);}MunichPromise.prototype.then=function(successed,failed){varself=this;returnnewMunichPromise((success,fail)=>{functioncallbackFun(callback){letpromise=callback(self.promiseValue);//调用成功或失败if(promiseinstanceofPromise){//如果返回的对象是一个promisepromise.then(//通过then得到结果,继续递归value=>{success(value);},reason=>{fail(reason);})}else{if(self.promiseStats==SUCCESSFLAG){success(self.promiseValue);//如果不是promise,直接返回结果}else{fail(self.promiseValue)}}}if(self.promiseStats==READYFLAG){//如果是第一次,将回调函数推送到数组对象self.promiseCallbacks.push({successful:(value)=>{callbackFun(successed)},failed:(reason)=>{callbackFun(failed)}})}elseif(self.promiseStats==SUCCESSFLAG){callbackFun(successed)}else{callbackFun(failed)}})}`
