什么是异步/等待?async是“异步”的意思,await是asyncwait的缩写。顾名思义,我们可以理解为等待异步函数执行完成。async函数返回一个Promise对象。如果直接在函数中返回一个值,async会通过Promise.resolve()把这个字面量封装成一个Promise对象。我们可以通过下面一段代码来说明这个结论:上面我们说过,await是用来等待async函数的返回值的。await不仅仅是用来等待Promise对象,它可以等待任何表达式的结果,如果不是Promise对象,那么他的运算结果就是返回的字符串/对象等价值。如果他等待一个Promise对象,那么他就开始阻塞下面的代码,直到他得到async返回的resolve值。我们可以在Promise中调用resolve()函数的操作,将其视为Promise中的耗时函数(如异步请求或settimeout()函数)已经处理完毕的信号,这样更容易理解。接下来我们使用settimeout函数来模拟耗时函数asyncfunctiontest(){varresult=awaitfetchrequest()returnresult}functionfetchrequest(){returnnewPromise((resolve,reject)=>{setTimeout(()=>{resolve("Done")},1000);})}console.time('testForEach');varresult=awaittest()console.log(result)console.timeEnd('testForEach');我们可以看到控制台在一秒后输出了“完成”的async/await应用场景我们会在什么情况下使用呢?当后一个请求取决于前一个请求的值时,一个请求跟随一个请求。例如:有一个列表页面,该页面需要显示我预订的所有信息。第一个接口返回所有事件id的集合,我需要根据这个集合请求第二个接口获取事件的具体信息asyncgetinfor(){让那个=这个;letlist=awaitthis.getlist();//获取列表letroundlist=awaitthis.getroundlist(list);//根据roundid获取列},getlist(){varthat=this;returnnewPromise((resolve,reject)=>{axios.get(url).then(data=>{resolve(data.data.data);//调用resolve()函数返回下一个需要的列表要求});});},又如:签到功能,如果签到成功,返回座位预订历史,如果签到失败,只异步显示签到失败的弹框getseathistory(){varmsign=awaitthis.handlesign();swith(msign){case"成功":this.$vux.toast.text("登录成功");...//执行获取后续座位预定历史break的请求;case"fail":this.$vux.toast.text("登录失败");休息;}},handlesign(){returnnewPromise((resolve,reject)=>{Axios.post(url,data).then(res=>{if(res.data.code!=200){resolve("成功");}elseif(res.data.code==200){res奥尔维(“失败”);}});});}并发请求需要同时获取列表的多个信息,信息需要多次请求获取,但是获取的信息没有依赖关系,可以同时请求。使用Promise.all([p1,p2,p3]),再举个例子:获取预约列表,第一个接口返回roundid(sessionid)和orderid(sessionid),我们需要roundid来请求事件信息,根据orderid请求预订信息。如果这个时候我们仍然按顺序要求,那需要时间。我们可以验证一下:orderrequest:asyncgetinfor(){letthat=this;console.time("测试");letlist=awaitthis.getlist();//获取列表letroundlist=awaitthis.getroundlist();//根据roundid获取列表letgetseatnum=awaitthis.getseatnum();//抢座成功获取座位号//Promise.all([that.getroundlist(),that.getseatnum()]).then((value)=>{//console.log(value)//})console.timeEnd("测试");}whileRequest:asyncgetinfor(){letthat=this;console.time("测试");letlist=awaitthis.getlist();//获取列表//letroundlist=awaitthis.getroundlist();//根据roundid获取列数//letgetseatnum=awaitthis.getseatnum();//获取座位号Promise.all([that.getroundlist(),that.getseatnum()]).then(value=>{console.log(value);console.timeEnd("test");});},我们可以看出请求的速度同时快,当逻辑比较复杂的时候,可以考虑使用async/await。当然也有人说为什么要用async/await而不用Promise呢?在实践中我们可以发现:Promise方案的死胡同——传参太麻烦,使用async/await读取返回值非常方便,代码清晰易读
