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之网页换肤实现代码
Apr 30 Javascript
jQuery 事件的命名空间简单了解
Nov 22 Javascript
jquery live()重复绑定的解决方法介绍
Jan 03 Javascript
JavaScript实现网页截图功能
Oct 16 Javascript
JavaScript包装对象使用详解
Jul 09 Javascript
JavaScript中localStorage对象存储方式实例分析
Jan 12 Javascript
js实现3D图片环展示效果
Mar 09 Javascript
在Swiper内如何制作CSS3动画效果示例代码
Dec 07 Javascript
Vue实现todolist删除功能
Jun 26 Javascript
Vue+elementui 实现复杂表头和动态增加列的二维表格功能
Sep 23 Javascript
详解vue中$nextTick和$forceUpdate的用法
Dec 11 Javascript
node实现mock-plugin中间件的方法
Dec 25 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目录遍历函数opendir用法实例
2014/11/20 PHP
php实现简易聊天室应用代码
2015/09/23 PHP
php实现图片上传、剪切功能
2016/05/07 PHP
Yii2框架加载css和js文件的方法分析
2019/05/25 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
理解 JavaScript 预解析
2009/10/25 Javascript
JS 事件绑定函数代码
2010/04/28 Javascript
JSQL 批量图片切换的实现代码
2010/05/05 Javascript
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
图解js图片轮播效果
2015/12/20 Javascript
利用Vue.js框架实现火车票查询系统(附源码)
2017/02/27 Javascript
使用原生js写ajax实例(推荐)
2017/05/31 Javascript
原生js实现拖拽功能基本思路详解
2018/04/18 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
jQuery 实现批量提交表格多行数据的方法
2018/08/09 jQuery
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
JavaScript事件对象深入详解
2018/12/30 Javascript
详解微信小程序获取当前时间及日期的方法
2019/04/28 Javascript
Layui弹出层 加载 做编辑页面的方法
2019/09/16 Javascript
微信小程序自定义弹出层效果
2020/05/26 Javascript
python处理大日志文件
2019/07/23 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
2020/01/22 Python
python except异常处理之后不退出,解决异常继续执行的实现
2020/04/25 Python
详解HTML5中的元素与元素
2015/08/17 HTML / CSS
美国排名第一的在线葡萄酒商店:Wine.com
2016/09/07 全球购物
RealTek面试题
2016/06/28 面试题
企业演讲稿范文
2013/12/28 职场文书
中国入世承诺
2014/04/01 职场文书
幼儿园八一建军节活动方案
2014/08/27 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
房屋转让协议书
2014/10/18 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书
2016年学习雷锋精神广播稿
2015/12/17 职场文书
计算机实训心得体会
2016/01/14 职场文书
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python