当前位置: 首页 > Web前端 > vue.js

关于Promise的小知识(二)

时间:2023-03-31 18:31:45 vue.js

小伙伴们,你们准备好迎接promise的到来了吗?是的,今天继续分享关于promise在es6上的扩展和使用。回顾一下es5上promise的基本用法:constp=newPromise(function(resolve,reject){/**....*/});p.then(res=>res).catch(err=>错误).finally(()=>{});在我们第一版的promise介绍中,我们也写了一个简化版的promise实现。不清楚的同学可以继续看之前的文章。但是细心的朋友会发现promise的demo版本是不能连续调用的。..之后继续优化。想知道怎么实现的可以自己看promise的源码实现。es6中新的promise方法等,可以看看阮大神的es6入门教程/promise。让我们继续看看有什么?这个Promise类绑定的方法好像有很多种:今天只说说我们日常开发中常用的几种类方法。*Promise.resolve*Promise.reject*Promise.all*Promise.race*Promise.resolvePromise.resolve('foo')//等同于newPromise(resolve=>resolve('foo'))详情见上神篇*Promise.rejectconstp=Promise.reject('somethingwentwrong');//等同于constp=newPromise((resolve,reject)=>reject('somethingwentwrong'))p.then(null,function(s){console.log(s)});//详细可以参考上面阮大神的文章*Promise.all主要是讲这个方法。Promise.all可以将多个Promise实例包装成一个新的Promise实例。同时,成功和失败的返回值不同。成功时返回结果数组,失败时返回最先被拒绝的值。letp1=newPromise((resolve,reject)=>{resolve('success')})letp2=newPromise((resolve,reject)=>{resolve('success')})letp3=Promse.reject('failed')Promise.all([p1,p2]).then((result)=>{console.log(result)//['success','success']}).catch((错误)=>{console.log(error)})Promise.all([p1,p3,p2]).then((result)=>{console.log(result)}).catch((error)=>{console...,直到那时只显示加载图标。代码模拟:letrequest=time=>{returnnewPromise((resolve,reject)=>{setTimeout(()=>{resolve(`${time/1000}`)},time)})}letp1=request(3000);letp2=request(2000);Promise.all([p1,p2]).then((result)=>{console.log(result)//['3后接口返回seconds','2秒后返回界面']}).catch((error)=>{console.log(error)})需要特别注意获取成功结果数组中数据的顺序Promise.all和Promise.all接收到的数组的顺序是一致的,即p1的结果在前,即使p1的结果比p2晚得到。这带来了一个很大的好处:在前端开发请求数据的过程中,偶尔会出现多次发送请求,并按照请求顺序获取和使用数据的场景,使用Promise.all无疑可以解决这个问题。现在有一个问题,如果我们想得到多个promise的结果,不管它们成功与否。看看下面的案例,说不定会对你有所帮助。constp1=newPromise((res,reject)=>{setTimeout(()=>{res('成功');},2000)});constp2=newPromise((res,reject)=>{setTimeout(()=>{reject('failed');},2000)});constp3=newPromise((res,reject)=>{setTimeout(()=>{reject('failed_3');},2000)})letpromises=[p1,p2,p3];//成功结果预返回letthenHandler=function(res){return{res:res,status:'success'}}//失败结果预返回letcatchHandler=function(err){return{err:err,status:'failed'}}lettransferredPromises=promises=>{//返回处理过的promise数组returnpromises.map(promise=>{returnpromise.then(thenHandler).catch(catchHandler);});}promises=transferredPromises(承诺);Promise.all(promises).then(res=>console.log(res,'res')).catch(e=>console.log(e,'catch'))*Promise.race顾名思义,Promse.race表示种族,也就是Promise.race([p1,p2,p3])快速得到哪个结果就返回那个结果,不管结果本身是成功状态还是失败状态letp1=newPromise((resolve,reject)=>{setTimeout(()=>{resolve('success')},1000)})letp2=newPromise((resolve,reject)=>{setTimeout(()=>{reject('failed')},500)})Promise.race([p1,p2]).then((result)=>{console.log(result)}).catch((error)=>{console.log(error)//openis'failed'})Promise在实际开发中几乎无处不在,所以学好promise是很有必要的。让我们一起再接再厉!