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

asyncawait详解

时间:2023-04-03 17:36:22 Node.js

asyncawait本身就是promise+generator的语法糖。本文主要介绍以下内容asyncawait本质asyncawait主要特点下面asyncawait本质使用promise+generate实现asyncawait//转换目标async1//asyncfunctionasync1(){//console.log('async1start');//等待async2();//console.log('async1结束');//}functionasync1(){//将async转换为*,将awiat转换为yieldvarawaitInstance=(function*(){console.log('async1start');yieldasync2();console.log('async1end');})()//自动执行await及后续代码//为简单起见,不处理异常functionstep(){varnext=awaitInstance.next();//使用Promise获取异步/同步方法的结果,然后执行下一步Promise.resolve(next.value).then(function(val){if(!next.done)step();})}步();//返回PromisereturnPromise.resolve(undefined);}asyncawait特性asyncmustreturnpromise//Case1:Returnasyncfunctionfn(){}fn().then(alert);//警报->undefined//Case2:returnnon-promiseasyncfunctionf(){return1}f().then(alert);//alert->1//情况3:returnPromiseasyncfunctionfn(){returnPromise.resolve(2);}fn().then(警报);//alert->2async中的代码直接执行(同步任务)console.log(1);异步函数fn(){console.log(2);等待console.log(3)console.log(4)}fn();控制台日志(5);//打印12354//为什么后面跟着354?往下看直接执行了await,await后面的代码是microtask异步函数async1(){console.log('async1start');等待async2();console.log('async1结束');}//类似于异步函数async1(){console.log('async1start');Promise.resolve(async2()).then(()=>{console.log('async1end');})}await之后的代码会等待await内部代码完成后,再执行异步函数async1(){console.log('async1开始');等待async2();console.log('async1结束');}asyncfunctionasync2(){returnnewPromise(function(resolve){setTimeout(function(){console.log('sleep2s');resolve('do');},2000)})}async1();//打印结果//async1start->sleep2s->async1endawait操作符用于等待一个Promise对象。它只能在异步函数内部使用。参考MDN附件:在chrome73.0.3683.86(64位)版本中,可以直接使用await。varx=awaitconsole.log(1)完持续更新中,来Github点击?