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 仿腾讯发表微博的效果代码
Dec 25 Javascript
js获取select标签选中值的两种方式
Jan 09 Javascript
jquery text()方法取标签中的文本
Jul 25 Javascript
javascript实现很浪漫的气泡冒出特效
Sep 05 Javascript
Javascript仿京东放大镜的效果
Mar 01 Javascript
angularjs中使用ng-bind-html和ng-include的实例
Apr 28 Javascript
微信小程序图片宽100%显示并且不变形
Jun 21 Javascript
webpack-dev-server自动更新页面方法
Feb 22 Javascript
es6函数name属性功能与用法实例分析
Apr 18 Javascript
vue setInterval 定时器失效的解决方式
Jul 30 Javascript
JavaScript中的执行环境和作用域链
Sep 04 Javascript
vue watch监控对象的简单方法示例
Jan 07 Vue.js
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判断浏览器的类型和语言的函数代码
2013/02/28 PHP
php目录操作实例代码
2014/02/21 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
2015/03/05 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
Laravel源码解析之路由的使用和示例详解
2018/09/27 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
JS Array对象入门分析
2008/10/30 Javascript
跟着JQuery API学Jquery 之二 属性
2010/04/09 Javascript
YUI的Tab切换实现代码
2010/04/11 Javascript
javascript new后的constructor属性
2010/08/05 Javascript
javascript下高性能字符串连接StringBuffer类
2010/08/16 Javascript
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
textarea不能通过maxlength属性来限制字数的解决方法
2014/09/01 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
vue项目中添加单元测试的方法
2018/07/21 Javascript
Layui多选只有最后一个值的解决方法
2019/09/02 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
Node.js API详解之 repl模块用法实例分析
2020/05/25 Javascript
python快速查找算法应用实例
2014/09/26 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
python 解决Windows平台上路径有空格的问题
2020/11/10 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
2020/11/28 Python
英国经典球衣网站:Classic Football Shirts
2017/05/20 全球购物
德国大型箱包和皮具商店:Koffer
2019/10/01 全球购物
CK澳大利亚官网:Calvin Klein澳大利亚
2020/12/12 全球购物
英国健身专家:WIT Fitness
2021/02/09 全球购物
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
Windows和Linux动态库应用异同
2016/07/28 面试题
面向对象设计的原则是什么
2013/02/13 面试题
信用社主任竞聘演讲稿
2014/05/23 职场文书
2014年爱国卫生工作总结
2014/11/22 职场文书
深入浅析python3 依赖倒置原则(示例代码)
2021/07/09 Python