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 文档碎片
Jul 13 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
Oct 06 Javascript
JavaScript中SetInterval与setTimeout的用法详解
Nov 10 Javascript
Javascript技术难点之apply,call与this之间的衔接
Dec 04 Javascript
深入理解jquery跨域请求方法
May 18 Javascript
浅谈 Vue v-model指令的实现原理
Jun 08 Javascript
在小程序中使用Echart图表的示例代码
Aug 02 Javascript
jQuery实现图片简单轮播功能示例
Aug 13 jQuery
Vue项目路由刷新的实现代码
Apr 17 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
Sep 27 Javascript
微信小程序顶部导航栏可滑动并选中放大
Dec 05 Javascript
JS数组扁平化、去重、排序操作实例详解
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
如何使用PHP实现javascript的escape和unescape函数
2013/06/29 PHP
div li的多行多列 无刷新分页示例代码
2013/10/16 PHP
php中Snoopy类用法实例
2015/06/19 PHP
分享五个PHP7性能优化提升技巧
2015/12/07 PHP
Laravel5.7框架安装与使用学习笔记图文详解
2019/04/02 PHP
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
如何使用jQuery来处理图片坏链具体实现步骤
2013/05/02 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
2014/02/17 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
2015/10/30 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
2016/05/17 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
在HTML中使用JavaScript的两种方法
2020/12/24 Javascript
王纯业的Python学习笔记 下载
2007/02/10 Python
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
Flask框架使用DBUtils模块连接数据库操作示例
2018/07/20 Python
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
python 获得任意路径下的文件及其根目录的方法
2019/02/16 Python
Python常用的json标准库
2019/02/19 Python
如何在mac环境中用python处理protobuf
2019/12/25 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
python如何实时获取tcpdump输出
2020/09/16 Python
JINS眼镜官方网站:日本最大的眼镜邮购
2016/10/14 全球购物
爱尔兰电脑、家电和家具购物网站:Buy It Direct
2019/07/09 全球购物
对公司合理化的建议书
2014/03/12 职场文书
环保倡议书
2014/04/14 职场文书
倡议书格式
2014/04/14 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
2014年党员自我评价材料
2014/09/22 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
2015年七一建党节慰问信
2015/03/23 职场文书
刑事起诉书范文
2015/05/19 职场文书