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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。