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

[js]关于Promise的一些方法

时间:2023-03-27 15:16:00 JavaScript

Promise三种状态pendinginitialstatefulfilledsuccessfulstaterejectedrejectedinitialstateletp=newPromise(()=>{})console.log(p);成功状态letp=newPromise((resolve)=>{resolve()})console.log(p);拒绝状态letp=newPromise((resolve,reject)=>{reject()})console.log(p);单态和状态转换单态:Promise的状态Becomingfulfilled或resolved不会再次改变letp=newPromise((resolve,reject)=>{resolve()reject()})console.log(p);状态转换:resolve()将在接收到PromiseReceived状态时跟随letrej=newPromise((resolve,reject)=>{reject()})letp=newPromise((resolve,reject)=>{resolve(rej)})console.log(rej);控制台日志(p);methodthencatchfinallydoneresolverejectallallSettledraceanytry1.then(callback1,callback2)收到resolve或reject的返回值,根据不同的状态调用回调函数然后返回一个Promise,处理完成后报错rejectedletp=newPromise((resolve,reject)=>{reject("rejected")})letp1=p.then(null,res=>{console.log(res);})console.log(p1);然后返回一个Promise继续处理新的Promise((resolve,reject)=>{reject("reject")}).then(null,err=>{console.log(err);returnerr}).then(err=>{console.log(err);})//Rejection//Rejection2.catch等同于.then(null,rejection)用于指定错误发生时的回调函数newPromise((resolve,reject)=>{try{thrownewError('error');}catch(e){reject(e)}//等同于reject(newError("error"))}).then(val=>{console.log(val);}).catch(res=>{console.log(res);})catch捕获try中抛出的错误,然后reject改变状态并用"冒泡性”,会一直往下传递,直到被catch捕获支持then处理resolve,catch处理reject,catch可以捕获then中的error,类似于try/catchresolve的写法,再次抛出错误就不会了捕获到,也不会传给外层代码val);//Accept}).catch(res=>{console.log(res);})3.finally不管Pr的最终状态是否omise对象被fulfilled或者rejected,里面的回调函数会被执行finally的实现:Promise.prototype.finally=function(callback){letP=this.constructorreturnthis.then(value=>P.resolve(callback()).then(()=>value),reason=>P.resolve(callback()).then(()=>{throwreason}))}newPromise((resolve,reject)=>{reject("Error")}).finally(()=>{console.log(1);//1}).catch(res=>{console.log(res);//Error})可以看出finally执行了一个普通的回调函数,状态会往下传递4.done无法捕捉到最后的错误,可以用done抛出一个全局错误done承诺.原型。done=function(onFulfilled,onRejected){this.then(onFulfilled,onRejected).catch(函数(原因){setTimeout(()=>{throwreason},0)})}newPromise((resolve,reject)=>{reject(0)}).done(val=>{console.log(val);},res=>{console.log(res);})done也可以像then一样使用5.Promise.resolve()和Promise.reject()将一个对象转换为Promise对象以Promise.resolve(参数)为例Promise.resolve("foo")//等同于newPromise(resolve=>resolve("foo"))Promise实例的参数Promise.resolve不会做任何改变letp=newPromise((resolve,reject)=>{reject("error")})letp1=Promise.resolve(p)console.log(p1);参数是一个thenable对象,一个有then方法的对象的Promise.resolve()会将这个对象转化为一个Promise对象,然后立即执行thenable中的then方法letthenable={then:function(resolve,reject){resolve("accept")}}Promise.resolve(thenable).then(val=>{console.log(val);//accepting})参数没有then方法或者不是对象Promise.resolve()返回一个newPromise对象,状态为fulfilledletobj={a:0}Promise.resolve(obj).then(val=>{console.log(val.a);//a})直接返回一个fulfilled中的Promise对象state没有任何参数Promise.resolve().then(()=>{console.log("Acceptstatus");//Accepttransition})Promise.reject()也会返回一个新的Promise实例,状态为rejected和承诺。resolve()的区别是Promise.reject()的参数会原封不动的传下去6.Promise.all()和Promise.allSettled()Promise.all可以把多个Promise实例包装成一个新的Promise实例ifIfnot,Promise.resolve方法将被调用以将Promise实例参数转换为可迭代类型。Promise.all返回的Promise的状态取决于参数的状态。所有fulfilled都满足,rejected返回第一个rejectedletp1=Promise.resolve("Success")letp2="foo"letp3=Promise.reject("Failure1")letp4=Promise.reject("Failure2").catch(res=>{console.log("Own"+res);//自己失败2返回res})Promise.all([p1,p2,p4]).then(val=>{console.log(val);//["成功","foo","失败2"]})Promise.all([p2,p4,p3]).then(val=>{控制台日志(val);}).catch(res=>{console.log("all's"+res);//all'sfailure1})当参数有自己的catch时,状态为fulfill。有一个参数rejected会调用catchPromise.allSettledonall返回所有参数的状态和返回值letp1=Promise.resolve("success")letp2="foo"letp3=Promise.reject("failure1")letp4=Promise.reject("Failed2").catch(res=>{console.log("Own"+res);returnres})Promise.allSettled([p1,p2,p4])。然后(val=>{console.log(val);})Promise.allSettled([p2,p4,p3]).then(val=>{console.log(val);})7.Promise.race()与Promise.all相比,Promise.race将返回一个fulfilled或rejected参数。Promise.race返回的Promise的状态由运行最快的Promise决定。letp1=newPromise((resolve,reject)=>{setTimeout(resolve,1000,"p1accepts")})letp2=newPromise((resolve,reject)=>{setTimeout(reject,1500,"p2rejects")})Promise.race([p1,p2]).then(val=>{console.log(val);//p1接受}).catch(res=>{console.log(res);})8、Promise.any()Promise.any正好和Promise.all相反,有一个fulfilled的形状状态完成letp1=newPromise((resolve,reject)=>{setTimeout(resolve,2000,"p1accepts")})letp2=newPromise((resolve,reject)=>{setTimeout(reject,1500,"p2rejects")})letp3=newPromise((resolve,reject)=>{setTimeout(resolve,1000,"p3accepts")})Promise.any([p1,p2,p3]).then(val=>{console.log(val);//p3accepts}).catch(res=>{console.log(res);})如果全部被拒绝,一个Promise.any([p2]).then(val=>{console.log(val);}).catch(res=>{console.log(res);//AggregateError:Allpromiseswererejected})9.Promise.try()让同步函数执行两种方式同步实现//方法一Promise.try=function(func){return(async()=>func())()}//方法二Promise.try=function(func){returnnewPromise((resolve,reject)=>{resolve(func())})}func()如果是同步函数则立即执行,如果是异步函数则将返回值或错误返回给then处理letf=()=>控制台。log("now");Promise.try(f)console.log("next");//现在//下一个