async函数的实现原理

async函数的实现原理,就是将 Generator函数和自动执行器,包装在一个函数里。

  1. async function fn(args) {
  2. // ...
  3. }
  4. // 等同于
  5. function fn(args) {
  6. return spawn(function* () {
  7. // ...
  8. });
  9. }

所有的ES6 async函数都可以写成上面的第二种形式,其中的spawn函数就是自动执行器。

下面给出spawn函数的实现,基本就是前文自动执行器的翻版。

  1. function spawn(genF) {
  2. return new Promise(function(resolve, reject) {
  3. const gen = genF();
  4. function step(nextF) {
  5. let next;
  6. try {
  7. next = nextF();
  8. } catch(e) {
  9. return reject(e);
  10. }
  11. if(next.done) {
  12. return resolve(next.value);
  13. }
  14. Promise.resolve(next.value).then(function(v) {
  15. step(function() { return gen.next(v); });
  16. }, function(e) {
  17. step(function() { return gen.throw(e); });
  18. });
  19. }
  20. step(function() { return gen.next(undefined); });
  21. });
  22. }

es6 async函数的实现原理相关推荐

  1. es6 async函数的语法

    async函数的语法 async函数的语法规则总体上比较简单,难点是错误处理机制. 返回 Promise 对象 async函数返回一个 Promise 对象. async函数内部return语句返回的 ...

  2. es6 async函数的基本用法

    async函数的基本用法 async函数返回一个 Promise 对象,可以使用then方法添加回调函数.当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句 ...

  3. ES6 async函数(超级详细、易懂)

    下面是对 ES6 async函数的整理,希望可以帮助到有需要的小伙伴~ 文章目录 async函数是什么 异步函数声明式 异步函数表达式 返回Promise对象 await表达式 await处理错误 a ...

  4. es6 async函数的异步迭代器

    async函数的异步迭代器 <迭代器>一章说过,Iterator 接口是一种数据遍历的协议,只要调用迭代器对象的next方法,就会得到一个对象,表示当前遍历指针所在的那个位置的信息.nex ...

  5. es6 async函数实例:按顺序完成异步操作

    async函数实例:按顺序完成异步操作 实际开发中,经常遇到一组异步操作,需要按照顺序完成.比如,依次远程读取一组 URL,然后按照读取的顺序输出结果. ES6 Promise 的写法如下. func ...

  6. es6 async函数与其他异步处理方法的比较

    async函数与其他异步处理方法的比较 我们通过一个例子,来看 async函数与 Promise.Generator函数的比较. 假定某个 DOM 元素上面,部署了一系列的动画,前一个动画结束,才能开 ...

  7. 阮一峰老师的ES6入门:async 函数

    async 函数 1. 含义 ES2017 标准引入了 async 函数,使得异步操作变得更加方便. async 函数是什么?一句话,它就是 Generator 函数的语法糖. 前文有一个 Gener ...

  8. ES6学习笔记(十六)async函数

    1.含义 ES2017 标准引入了 async 函数,使得异步操作变得更加方便. async 函数是什么?一句话,它就是 Generator 函数的语法糖,号称异步的终极解决方案. 前文有一个 Gen ...

  9. async 函数——JS中的异步处理方式

    async 函数的语法 async function name([param[, param[, ... param]]]) { statements } name: 函数名称. param: 要传递 ...

最新文章

  1. kali开启禁止或删除ssh 开机启动
  2. 算法设计--查找无序数组中第K大的数字
  3. elastic-job详解(一):数据分片
  4. js 定时器的用法和清除
  5. html hover 效果,CSS八种让人眼前一亮的HOVER效果的示例代码
  6. 实验8 SQL Server 的存储过程
  7. [线性代数]Note2--矩阵消元
  8. kali 安装vmware 14 for linux 出现问题
  9. 1. 虚拟机使用技巧
  10. CentOS基本的命令与快捷建
  11. Mac 下载安装 Tomcat
  12. Word——论文排版技巧总结
  13. 数据结构银行排队系统c语言,数据结构-银行排队系统.doc
  14. OPA541 功率放大器 音频放大器 高电压大电流 电机功率驱动 原理图PCB
  15. mysql优化join_MySQL-巧用Join来优化SQL
  16. 电脑声音出现变声的问题
  17. 敏捷软件开发实践-客户合作胜过合同谈判
  18. 【4】 脑部MRI图像肿瘤分类级别
  19. (区块链溯源)基于Hyperledger Fabric 区块链的危险化学品溯源
  20. 产品思维训练 | 你的项目总是不能按期上线,你会如何解决?

热门文章

  1. 《Android深入透析》之界面
  2. [Oracle]如何查看一个数据文件是否是自动扩展
  3. VDI序曲十四 使用 RemoteFX 安装和配置 USB 重定向
  4. 3G或应尽早步入细分市场时代
  5. SpringBoot异常处理以及对数据正确性的检查
  6. 其他用户登陆到这台计算机,要登录到这台远程计算机,您必需拥有这台计算机上的‘终端服务器用户访问’权限解决方法...
  7. 12月29日云栖精选夜读 | SQL Server数据库漏洞评估了解一下
  8. 10-C++远征之模板篇-学习笔记
  9. 创建服务factory和service方法的区别
  10. 关闭 IOS8 最近使用 最近联系人