JS为什么说async/await是generator的语法糖详解


Posted in Javascript onJuly 11, 2019

关于async的介绍,在阮一峰的ES6入门教程中说到:

async 函数是什么?一句话,它就是 Generator 函数的语法糖。

可是,为什么这么说呢?

首先,比如说有一个异步操作,使用 async/await 语法来以同步模拟异步操作。

使用 async/await 实现一个 sleep 的功能

function sleep(time) {
 return new Promise((resolve, reject) => {
 setTimeout(() => {
  resolve(1);
 }, time);
 });
}

async function test () {
 for(let i = 0; i < 10; i++) {
 let result = await sleep(1000);
 console.log(result);
 }
}

将 async/await 转成 generator 和 promise 来实现:

let test = function () {
 // ret 为一个Promise对象,因为ES6语法规定 async 函数的返回值必须是一个 promise 对象
 let ret = _asyncToGenerator(function* () {
 for (let i = 0; i < 10; i++) {
  let result = yield sleep(1000);
  console.log(result);
 }
 });
 return ret;
}();

// generator 自执行器
function _asyncToGenerator(genFn) {
 return new Promise((resolve, reject) => {
 let gen = genFn();
 function step(key, arg) {
  let info = {};
  try {
  info = gen[key](arg);
  } catch (error) {
  reject(error);
  return;
  }
  if (info.done) {
  resolve(info.value);
  } else {
  return Promise.resolve(info.value).then((v) => {
   return step('next', v);
  }, (error) => {
   return step('throw', error);
  });
  }
 }
 step('next');
 });
}

看完以上代码,是不是一目了然了啊。将 async/await 使用 generator 进行改写的关键是要使用 promise 来实现一个 generator 自执行器。在babel中,大体的原理也是类似的。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
用jQuery打造TabPanel效果代码
May 22 Javascript
javascript中用星号表示预录入内容的实现代码
Jan 08 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
May 31 Javascript
深入理解jquery中的each用法
Dec 14 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
Jan 05 Javascript
Bootstrap警告框(Alert)插件使用方法
Mar 21 Javascript
10道典型的JavaScript面试题
Mar 22 Javascript
浅谈Vue下使用百度地图的简易方法
Mar 23 Javascript
解决layer.open后laydate失效的问题
Sep 06 Javascript
微信小程序实现锚点功能
Nov 20 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
Dec 01 Javascript
vue-drawer-layout实现手势滑出菜单栏
Nov 19 Vue.js
Vue 使用计时器实现跑马灯效果的实例代码
Jul 11 #Javascript
Vue 子组件与数据传递问题及注意事项
Jul 11 #Javascript
ES6的异步终极解决方案分享
Jul 11 #Javascript
微信小程序的开发范式BeautyWe.js入门详解
Jul 10 #Javascript
实现一个 Vue 吸顶锚点组件方法
Jul 10 #Javascript
vue webpack重写cookie路径的方法
Jul 10 #Javascript
vue登录页面cookie的使用及页面跳转代码
Jul 10 #Javascript
You might like
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
2010/05/10 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
php接口实现拖拽排序功能
2018/04/23 PHP
json 实例详细说明教程
2009/10/31 Javascript
JQuery扩展插件Validate—4设置错误提示的样式
2011/09/05 Javascript
js实现的复制兼容chrome和IE
2014/04/03 Javascript
jQuery选择器用法实例详解
2015/12/17 Javascript
JavaScript仿百度图片浏览效果
2016/11/23 Javascript
jQuery实现字符串全部替换的方法
2016/12/12 Javascript
vue项目中做编辑功能传递数据时遇到问题的解决方法
2016/12/19 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
使用cookie绕过验证码登录的实现代码
2017/10/12 Javascript
js原生方法被覆盖,从新赋值原生的方法
2018/01/02 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
详解如何运行vue项目
2019/04/15 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
详解JavaScript之ES5的继承
2020/07/08 Javascript
[07:08]2014DOTA2西雅图国际邀请赛 小组赛7月11日TOPPLAY
2014/07/11 DOTA
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
python ftp 按目录结构上传下载的实现代码
2018/09/12 Python
python中if及if-else如何使用
2020/06/02 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
css3 transform及原生js实现鼠标拖动3D立方体旋转
2016/06/20 HTML / CSS
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
AmazeUI折叠式卡片布局,整合内容列表、表格组件实现
2020/08/20 HTML / CSS
为什么要用EJB
2014/04/17 面试题
教师实习期自我鉴定
2013/10/06 职场文书
技术学校毕业生求职信分享
2013/12/02 职场文书
自荐信范文
2013/12/10 职场文书
村干部承诺书
2014/03/28 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
导游词欢迎词
2015/02/02 职场文书
525心理健康活动总结
2015/05/08 职场文书
Canvas跟随鼠标炫彩小球的实现
2021/04/11 Javascript
与Windows10相比Windows11有哪些改进?值不值得升级?
2021/11/21 数码科技