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 confirm选择判断
Oct 18 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
Aug 12 Javascript
Js 时间函数getYear()的使用问题探讨
Apr 01 Javascript
JS实现文字掉落效果的方法
May 06 Javascript
jquery实现的淡入淡出下拉菜单效果
Aug 25 Javascript
Javascript如何判断数据类型和数组类型
Jun 22 Javascript
浅谈jquery中使用canvas的问题
Oct 10 Javascript
jQuery Jsonp跨域模拟搜索引擎
Jun 17 jQuery
Angular.JS中指令ng-if的注意事项小结
Jun 21 Javascript
VueJs使用Amaze ui调整列表和内容页面
Nov 30 Javascript
小程序:授权、登录、session_key、unionId的详解
May 15 Javascript
JavaScript实现多个物体同时运动
Mar 12 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 5.0对象模型深度探索之对象复制
2008/03/27 PHP
php绝对路径与相对路径之间关系的的分析
2010/03/03 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
2015/11/17 PHP
php实现微信扫码自动登陆与注册功能
2016/09/22 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
Javascript Web Slider 焦点图示例源码
2013/10/10 Javascript
js中将String转换为number以便比较
2014/07/08 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
2016/06/20 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
jQuery接受后台传递的List的实例详解
2017/08/02 jQuery
jquery中有哪些api jQuery主要API
2017/11/20 jQuery
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
微信小程序后端无法保持session的原因及解决办法问题
2020/03/20 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
Python交换变量
2008/09/06 Python
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
Python reduce()函数的用法小结
2017/11/15 Python
Python中如何导入类示例详解
2019/04/17 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
CSS3 border-image详解、应用及jQuery插件
2011/08/29 HTML / CSS
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
在网上学习全世界最好的课程:Coursera
2017/11/07 全球购物
有abstract方法的类一定要用abstract修饰吗
2016/03/14 面试题
英语自荐信范文
2013/12/11 职场文书
银行贷款承诺书
2014/03/29 职场文书
单位消防安全责任书
2014/07/23 职场文书
机关干部作风建设剖析材料
2014/10/23 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
JS一分钟在github+Jekyll的博客中添加访问量功能的实现
2021/04/03 Javascript