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中yield实用简洁实现方式
Jun 12 Javascript
根据一段代码浅谈Javascript闭包
Dec 14 Javascript
js判断选择的时间是否大于今天的代码
Aug 20 Javascript
JS替换字符串中空格方法
Apr 17 Javascript
jquery实现通用的内容渐显Tab选项卡效果
Sep 07 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
May 04 Javascript
将 vue 生成的 js 上传到七牛的实例
Jul 28 Javascript
利用不到200行代码写一款属于你自己的js类库
Jul 08 Javascript
解决vue-router 二级导航默认选中某一选项的问题
Nov 01 Javascript
Angular value与ngValue区别详解
Nov 27 Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
Apr 10 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
May 06 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中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
php图片加中文水印实现代码分享
2012/10/31 PHP
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
php注册登录系统简化版
2020/12/28 PHP
laravel-admin 中列表筛选方法
2019/10/03 PHP
PHP 实现 WebSocket 协议原理与应用详解
2020/04/22 PHP
基于PHP实现用户在线状态检测
2020/11/10 PHP
javascript实现禁止鼠标滚轮事件
2015/07/24 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
利用Angularjs实现幻灯片效果
2016/09/07 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
原生js实现放大镜
2017/02/20 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
React Native 使用Fetch发送网络请求的示例代码
2017/12/02 Javascript
Vue 全局loading组件实例详解
2018/05/29 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
bootstrap table合并行数据并居中对齐效果
2018/10/17 Javascript
使用vue-cli3 创建vue项目并配置VS Code 自动代码格式化 vue语法高亮问题
2019/05/14 Javascript
uni-app从安装到卸载的入门教程
2020/05/15 Javascript
微信小程序拖拽排序列表的示例代码
2020/07/08 Javascript
[02:22]2018DOTA2亚洲邀请赛VG赛前采访
2018/04/03 DOTA
python实现2014火车票查询代码分享
2014/01/10 Python
Django学习笔记之Class-Based-View
2017/02/15 Python
python实现上传下载文件功能
2020/11/19 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
详解python3中的真值测试
2018/08/13 Python
浅谈python脚本设置运行参数的方法
2018/12/03 Python
python 变量初始化空列表的例子
2019/11/28 Python
python生成特定分布数的实例
2019/12/05 Python
python修改linux中文件(文件夹)的权限属性操作
2020/03/05 Python
linux系统下pip升级报错的解决方法
2021/01/31 Python
利用CSS3实现自定义滚动条代码分享
2016/08/18 HTML / CSS
股份合作协议书范本
2014/04/14 职场文书
植物园观后感
2015/06/11 职场文书
详解CocosCreator消息分发机制
2021/04/16 Javascript