• 主页
  • 归档
  • 分类
  • 照片墙
所有文章 友情链接 关于我

  • 主页
  • 归档
  • 分类
  • 照片墙
  1. 1. Promise.all
  2. 2. async/await
  3. 3. One by one

优雅写异步与循环

2019-06-29 23:39:46
总字数 462
预计阅读时间 2 分钟

JS当中的循环都是非异步的
包括但不限于

  1. Array.prototype中的forEach
  2. for ... in 语法
  3. for ... of 语法

所以如果要在循环内的异步全部完成后做某些事情
例如

1
2
3
4
5
6
7
8
9
10
// 这里我只是简单构造了一个异步
// 实际运用当中譬如数据库查询、文件读写等操作, 通常都是异步的
function show(num) {
Promise.resolve(num).then(console.log)
}
const arr = [100, 200, 300]

console.log('start')
arr.forEach(show)
console.log('end')

上面的写法根据事件队列的机制, 显然会先输出end, 再输出数组元素的值
当然我们可以在Promise的resolve函数当中判断是否到达了数组最后一个元素, 把输出end的操作写进resolve函数里面
显然这不够优雅, 而且很多时候也不方便这样做

实现方式

Promise.all

1
2
3
4
5
6
7
8
const arr = [100, 200, 300]

console.log('start')
console.time('promise all in')
Promise.all(arr.map(show)).then(() => {
console.timeEnd('promise all in')
console.log('end')
})

为了比较执行性能的差异, 加了一个计时 ( Nodejs环境运行 )
Promise.all时间

async/await

1
2
3
4
5
6
7
8
9
const arr = [100, 200, 300];

(async function() {
console.log('start')
console.time('await all in')
for await (let i of arr.map(show)) {}
console.timeEnd('await all in')
console.log('end')
})()

await时间
由于await必须用在async修饰的函数当中, 所以包装了一层
实际执行时间与Promise.all差不多

One by one

这种方式效率最低,有点类似于同步语言中的循环,一个接着一个执行,耗时自然也就是所有异步方法耗时的总和。对资源的消耗最小。

1
2
3
4
5
6
7
8
9
10
11
const arr = [100, 200, 300];

(async function() {
console.log('start')
console.time('await one by one')
for (let item of arr) {
await show(item)
}
console.timeEnd('await one by one')
console.log('end')
})()
  • JavaScript
  • JavaScript

扫一扫,分享到微信

博客全文检索施工记录
TypeScript初见 
© 2026 夏夜梦星辰
鲁ICP备19028444号
Power By Hexo
  • 所有文章
  • 友情链接
  • 关于我
{{searchItem.query}}
标签: 分类:
  • maven
  • 持续集成
  • JMS
  • 线程
  • flutter
  • dart
  • 数据库
  • MongoDB
  • 索引
  • 集群
  • 全文检索
  • JavaScript
  • ECMAScript6
  • 单元测试
  • Promise
  • Web Worker
  • 函数
  • prototype
  • 模块化
  • 正则表达式
  • git
  • 版本控制
  • TensorFlow
  • 机器学习
  • 算法
  • 动态规划
  • 数据结构
  • linux
  • shell
  • docker
  • nginx
  • jenkins
  • opencv
  • vim
  • react
  • react native
  • 前端
  • css
  • HTML5
  • Hexo
  • sass
  • Three.js
  • TypeScript
  • Vue
  • 组件化
  • base64
  • webpack
  • nodejs
  • gulp
  • Java
  • flutter
  • MongoDB
  • JavaScript
  • Git
  • 男生女生
  • 算法
  • linux
  • react
  • 前端杂烩
  • 十年饮冰,难凉热血
  • †少女癌†
  • 猫与向日葵
  • coderfun
  • JENKINS
  • API管理后台
愿你最终能接纳每一面每一种的自己
独自活着便是团圆