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 相关文章推荐
Javascript 继承机制实例
Aug 12 Javascript
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
Nov 04 Javascript
解析window.open的使用方法总结
Jun 19 Javascript
javascript中的nextSibling使用陷(da)阱(keng)
May 05 Javascript
javascript获取元素离文档各边距离的方法
Feb 13 Javascript
jquery滚动条插件slimScroll使用方法
Feb 09 Javascript
Vue.js tab实现选项卡切换
May 16 Javascript
Javascript实现基本运算器
Jul 15 Javascript
js 公式编辑器 - 自定义匹配规则 - 带提示下拉框 - 动态获取光标像素坐标
Jan 04 Javascript
JavaScript使用math.js进行精确计算操作示例
Jun 19 Javascript
jQuery实现的自定义轮播图功能详解
Dec 28 jQuery
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
Oct 22 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
php代码优化及php相关问题总结
2006/10/09 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
PHP Global定义全局变量使用说明
2013/08/15 PHP
PHP依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
对php 判断http还是https,以及获得当前url的方法详解
2019/01/15 PHP
PHP实现的杨辉三角求解算法分析
2019/03/11 PHP
浅谈laravel数据库查询返回的数据形式
2019/10/21 PHP
php+websocket 实现的聊天室功能详解
2020/05/27 PHP
可缩放Reloaded-一个针对可缩放元素的复用组件
2007/03/10 Javascript
JavaScript实现数组在指定位置插入若干元素的方法
2015/04/06 Javascript
微信小程序 教程之条件渲染
2016/10/18 Javascript
浅谈js函数三种定义方式 &amp; 四种调用方式 &amp; 调用顺序
2017/02/19 Javascript
vue初始化动画加载的实例
2018/09/01 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
2018/09/25 Javascript
详解auto-vue-file:一个自动创建vue组件的包
2019/04/26 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
vue+node 实现视频在线播放的实例代码
2020/10/19 Javascript
[03:30]完美盛典趣味短片 CSGO2019年度名场面
2019/12/07 DOTA
python实现巡检系统(solaris)示例
2014/04/02 Python
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
Python中getpass模块无回显输入源码解析
2018/01/11 Python
从0开始的Python学习016异常
2019/04/08 Python
Django使用中间键实现csrf认证详解
2019/07/22 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
理财投资建议书
2014/03/12 职场文书
入党介绍人评语
2014/05/06 职场文书
留学推荐信范文
2014/05/10 职场文书
股指期货心得体会
2014/09/10 职场文书
鸟的天堂导游词
2015/01/31 职场文书
离职信范本
2015/06/23 职场文书