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

实际开发中,经常遇到一组异步操作,需要按照顺序完成。比如,依次远程读取一组 URL,然后按照读取的顺序输出结果。

ES6 Promise 的写法如下。

  1. function logInOrder(urls) {
  2. // 远程读取所有URL
  3. const textPromises = urls.map(url => {
  4. return fetch(url).then(response => response.text());
  5. });
  6. // 按次序输出
  7. textPromises.reduce((chain, textPromise) => {
  8. return chain.then(() => textPromise)
  9. .then(text => console.log(text));
  10. }, Promise.resolve());
  11. }

上面代码使用fetch方法,同时远程读取一组 URL。每个fetch操作都返回一个 Promise 对象,放入textPromises数组。然后,reduce方法依次处理每个 Promise 对象,然后使用then,将所有 Promise 对象连起来,因此就可以依次输出结果。

这种写法不太直观,可读性比较差。下面是 async函数实现。

  1. async function logInOrder(urls) {
  2. for (const url of urls) {
  3. const response = await fetch(url);
  4. console.log(await response.text());
  5. }
  6. }

上面代码确实大大简化,问题是所有远程操作都是继发。只有前一个 URL 返回结果,才会去读取下一个 URL,这样做效率很差,非常浪费时间。我们需要的是并发发出远程请求。

  1. async function logInOrder(urls) {
  2. // 并发读取远程URL
  3. const textPromises = urls.map(async url => {
  4. const response = await fetch(url);
  5. return response.text();
  6. });
  7. // 按次序输出
  8. for (const textPromise of textPromises) {
  9. console.log(await textPromise);
  10. }
  11. }

上面代码中,虽然map方法的参数是async函数,但它是并发执行的,因为只有async函数内部是继发执行,外部不受影响。后面的for..of循环内部使用了await,因此实现了按顺序输出。

es6 async函数实例:按顺序完成异步操作相关推荐

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

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

  2. es6 async函数的语法

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

  3. es6 async函数的基本用法

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

  4. es6 async函数的实现原理

    async函数的实现原理 async函数的实现原理,就是将 Generator函数和自动执行器,包装在一个函数里. async function fn(args) { // ... } // 等同于 ...

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

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

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

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

  7. 【ES6】异步操作和async函数

    [ES6]异步操作和async函数 一.基本概念 二.回调函数 三.Promise 四.async函数 查看更多ES6教学文章: 参考文献 引言:ES6新增的Generato.Promise.asyn ...

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

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

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

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

最新文章

  1. Pytorch: 命名实体识别: BertForTokenClassification/pytorch-crf
  2. Flask | 浅读文档,快速出发
  3. 湖北大学校长计算机考研复试分数线,湖北大学考研复试分数线
  4. Linux安装jdk学习
  5. 离散数学反对称关系_【离散数学】1.2&1.3集合与元素,集合与集合之间的关系...
  6. 【Python】xlwt和xlrd模块写入和读取.xls版本EXCEL
  7. 检查图层当中是否存在高程基准(C++)ArcObject
  8. BZOJ 1070: [SCOI2007]修车
  9. 网页中多层效果的灵活使用
  10. Ubuntu下安装uwsgi报错的解决方案
  11. MPush安装部署应用
  12. scala发送邮件设置参数
  13. flex 文字竖排_4种CSS文字竖排方法
  14. matlab文件批量命名,利用MATLAB批量对文件重命名
  15. 水仙花数的while方法
  16. 四类九种移位寄存器总结(循环(左、右、双向)移位寄存器、逻辑和算术移位寄存器、串并转换移位寄存器、线性反馈移位寄存器LFSR|verilog代码|Testbench|仿真结果)
  17. Excel绘制散点图并拟合输出公式和R值
  18. 一张图,了解网站SEO方案
  19. 9.8.1 1.打印head标签的内容。2.打印body标签的内容。3.打印id为Hi的标签对象
  20. 量化投资 — 移动平均及双均线策略

热门文章

  1. [USACO08OPEN]寻宝之路Clear And Present Danger
  2. Docker - 导出导入容器
  3. 关闭和启动Oracle的几种方法总结
  4. ACKRec:注意力异构图卷积深度知识推荐器 SIGIR 2020
  5. java jre 与jdk的区别_学习java却不知道JRE和JDK的区别?看完这篇文章,让你受益匪浅...
  6. 大学大专mysql考试试卷_MySQL数据库基础应用-中国大学mooc-试题题目及答案
  7. python+ seleniumAPPium自动化 page Object 设计模式
  8. win10--vs2015--libjpeg--64位库的编译过程记录
  9. 云安全仍然是程序开发者头痛的问题
  10. 基于 Android 6.0 的 小米 MIUI 8 已开源