博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript 循环:如何处理 async/await
阅读量:6262 次
发布时间:2019-06-22

本文共 1871 字,大约阅读时间需要 6 分钟。

如何串行或者并行运行异步循环?

在使用循环处理异步的魔法之前,我们先来看下我们是怎么处理同步循环的。

同步循环

很久以前我写的循环是这样的:

for (var i = 0; i < array.length; i++) {  var item = array[i];  //  do something with item}

后来 JavaScript 提供了很多新的特性,现在我们会更倾向于用下面这种写法:

array.forEach((item) => {  //  do something with item})

在开发过程可能会有这么一种需求,我们需要在循环中异步处理 item,那么可以怎么做呢?

异步循环

如何在循环中使用 await?我们试着写一个异步函数,然后 await 每一次循环任务。

async function processArray(array) {  array.forEach(() => {    //  define synchronous anonymous function    //  it will throw error here    await func(item)  });}

这个代码会抛出一个错误,因为我们不能在同步方法中使用 await, processArray 确实是异步函数,但是 array.forEach 里的匿名函数是同步的。

1. 不要等待结果

要处理这个问题,我们可以把这个匿名函数定义为异步的:

async function processArray(array) {  array.forEach(() => {    await delayedLog(item)  });  console.log('Done!');}

但是这样的话 forEach 方法就相当于异步的了,不会等待遍历完所有的 item,例如下面这段代码:

function delay () {  return new Promise(resolve => setTimeout(resolve, 300));}async function delayedLog(item) {  //  notice that we can await a function that returns promise  await delay();  //  log item only after a delay   console.log(item);}async function processArray(array) {  array.forEach(() => {    await delayedLog(item)  });  console.log('Done!');}processArray([1, 2, 3]);

将会输出:

Done!123

如果你不需要等待这个循环完成,这样就已经可以了。但是大部分情况我们还是需要等待这个循环完成才进行之后的操作。

2. 串行遍历

要等待所有的结果返回,我们还是要回到老式的 for 循环写法:

async function processArray(array) {  for (const item of arr) {    await delayedLog(item);  }  console.log('Done!');}

最后的结果符合我们的预期:

123Done!

上面这段的遍历代码是串行执行的,我们也可以把它换成并行的。

3. 并行遍历

我们可以稍微更改上面的代码来编程并行的:

async function processArray(array) {  //  map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。  //  async 修饰的方法返回值是一个promise对象,因此下面map的返回值就是一个promise列表  const promiseArr = array.map(delayedLog);  //  wait until all promises are resolved  await Promise.all(promiseArr);  console.log('Done!');}

(注意:对于特别大的数组不建议使用这种写法,太多的并行任务会加重 CPU 和内存的负荷)

 转自:https://zhuanlan.zhihu.com/p/31000936

转载地址:http://uizpa.baihongyu.com/

你可能感兴趣的文章
获双重认证,新华三又添双可信资质
查看>>
json \u unicode字符串转化 c++
查看>>
WinDbg 调试工具的使用
查看>>
最全linux命令
查看>>
Jexus部署.Net Core项目
查看>>
tomcat设置
查看>>
第十二单元 不同系统之间的文件传输
查看>>
安装mysql报错,错误提示:Incorrect definition of table mysql.proc
查看>>
网吧维护工具
查看>>
BOOT.INI文件参数
查看>>
Exchange-批量创建通讯组邮箱
查看>>
系统目录结构、ls命令、文件类型、alias命令
查看>>
win10 uwp 异步转同步
查看>>
简单CDN之智能DNS
查看>>
UPS工作模式简析
查看>>
词向量-LRWE模型
查看>>
Selenium打包成exe运行出错
查看>>
shell脚本之重定向、标准输入、输出、错误输出的使用
查看>>
如何从Google官网下载Chrome离线安装包
查看>>
JAR——CircleImageView
查看>>