JS为什么说async/await是generator的语法糖详解
关于async的介绍,在阮一峰的ES6入门教程中说到:
async函数是什么?一句话,它就是Generator函数的语法糖。
可是,为什么这么说呢?
首先,比如说有一个异步操作,使用async/await语法来以同步模拟异步操作。
使用async/await实现一个sleep的功能
functionsleep(time){ returnnewPromise((resolve,reject)=>{ setTimeout(()=>{ resolve(1); },time); }); } asyncfunctiontest(){ for(leti=0;i<10;i++){ letresult=awaitsleep(1000); console.log(result); } }
将async/await转成generator和promise来实现:
lettest=function(){ //ret为一个Promise对象,因为ES6语法规定async函数的返回值必须是一个promise对象 letret=_asyncToGenerator(function*(){ for(leti=0;i<10;i++){ letresult=yieldsleep(1000); console.log(result); } }); returnret; }(); //generator自执行器 function_asyncToGenerator(genFn){ returnnewPromise((resolve,reject)=>{ letgen=genFn(); functionstep(key,arg){ letinfo={}; try{ info=gen[key](arg); }catch(error){ reject(error); return; } if(info.done){ resolve(info.value); }else{ returnPromise.resolve(info.value).then((v)=>{ returnstep('next',v); },(error)=>{ returnstep('throw',error); }); } } step('next'); }); }
看完以上代码,是不是一目了然了啊。将async/await使用generator进行改写的关键是要使用promise来实现一个generator自执行器。在babel中,大体的原理也是类似的。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。