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 相关文章推荐
JS提交并解析后台返回的XML的代码
Nov 03 Javascript
ExtJS 简介 让你知道extjs是什么
Dec 29 Javascript
25个优雅的jQuery Tooltip插件推荐
May 25 Javascript
用jquery等比例控制图片宽高的具体实现
Jan 28 Javascript
JS打字效果的动态菜单代码分享
Aug 21 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
Sep 11 Javascript
jQuery实现鼠标经过事件的延时处理效果
Aug 20 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
Jul 01 Javascript
Node.js中的require.resolve方法使用简介
Apr 23 Javascript
vue2的todolist入门小项目的详细解析
May 11 Javascript
bootstrap3中container与container_fluid外层容器的区别讲解
Dec 04 Javascript
Vue 同步异步存值取值实现案例
Aug 05 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
SMARTY学习手记
2007/01/04 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
laravel手动创建数组分页的实现代码
2018/06/07 PHP
ajax 文件上传应用简单实现
2009/03/03 Javascript
让firefox支持IE的一些方法的javascript扩展函数代码
2010/01/02 Javascript
jQuery实现图片放大预览实现原理及代码
2013/09/12 Javascript
jQuery基于当前元素进行下一步的遍历
2014/05/20 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
微信小程序-滚动消息通知的实例代码
2017/08/03 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
js防抖和节流的深入讲解
2018/12/06 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
JavaScript中AOP的实现与应用
2019/05/06 Javascript
微信浏览器左上角返回按钮监听的实现
2020/03/04 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
uniapp电商小程序实现订单30分钟倒计时
2020/11/01 Javascript
[00:20]TI9观赛名额抽取Ⅱ
2019/07/24 DOTA
python字典基本操作实例分析
2015/07/11 Python
使用python为mysql实现restful接口
2018/01/05 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
Python常见数字运算操作实例小结
2019/03/22 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
Python字符串处理的8招秘籍(小结)
2019/08/13 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
python属于哪种语言
2020/08/16 Python
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
一份婚庆公司创业计划书
2014/01/11 职场文书
毕业寄语大全
2014/04/09 职场文书
综治宣传月活动总结
2014/04/28 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
电台编导求职信
2014/05/06 职场文书
小学模范班主任事迹材料
2014/05/13 职场文书
运输公司工作总结
2015/08/11 职场文书
Redis keys命令的具体使用
2022/06/05 Redis