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 相关文章推荐
document.getElementById方法在Firefox与IE中的区别
May 18 Javascript
JS解决url传值出现中文乱码的另类办法
Apr 08 Javascript
Extjs4 GridPanel 的几种样式使用介绍
Apr 18 Javascript
js添加select下默认的option的value和text的方法
Oct 19 Javascript
jquery中change()用法实例分析
Feb 06 Javascript
jQuery+jRange实现滑动选取数值范围特效
Mar 14 Javascript
js实现可键盘控制的简单抽奖程序
Jul 13 Javascript
bootstrap栅格系统示例代码分享
May 22 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
Oct 19 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
Sep 13 Javascript
VUE简单的定时器实时刷新的实现方法
Jan 20 Javascript
微信小程序后端实现授权登录
Feb 24 Javascript
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
WordPres对前端页面调试时的两个PHP函数使用小技巧
2015/12/22 PHP
PHP的Yii框架入门使用教程
2016/02/15 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
iis6手工创建网站后无法运行php脚本的解决方法
2017/06/08 PHP
Javascript this 的一些学习总结
2012/08/02 Javascript
Js中获取frames中的元素示例代码
2013/07/30 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
2015/11/21 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
纯JavaScript实现实时反馈系统时间
2017/10/26 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
Python合并字符串的3种方法
2015/05/21 Python
在Django的视图中使用form对象的方法
2015/07/18 Python
Python使用爬虫猜密码
2016/02/19 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
python实现txt文件格式转换为arff格式
2018/05/31 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
python里 super类的工作原理详解
2019/06/19 Python
什么是python的函数体
2020/06/19 Python
python3.9.1环境安装的方法(图文)
2021/02/02 Python
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
德国富尔达运动鞋店:43einhalb
2020/12/25 全球购物
机修工岗位职责
2013/11/24 职场文书
法学专业本科生自荐信范文
2013/12/17 职场文书
校园餐饮创业计划书
2014/01/10 职场文书
高中军训感言400字
2014/02/24 职场文书
开工典礼策划方案
2014/05/23 职场文书
基层党员对照检查材料
2014/08/25 职场文书
基层工作经历证明
2015/06/19 职场文书
呐喊读书笔记
2015/06/30 职场文书
MYSQL 表的全面总结
2021/11/11 MySQL