在forEach循环中使用async / await是否有任何问题? 我正在尝试遍历文件数组并await每个文件的内容。

import fs from 'fs-promise'

async function printFiles () {

const files = await getFilePaths() // Assume this works fine

files.forEach(async (file) => {

const contents = await fs.readFile(file, 'utf8')

console.log(contents)

})

}

printFiles()

这段代码确实有效,但是这可能会出问题吗? 我让某人告诉我,您不应该在这样的高阶函数中使用async / await ,所以我只想问一下这是否有问题。

#1楼

确保代码确实有效,但是我很确定它不会实现您期望的功能。 它只是触发多个异步调用,但是在printFiles之后printFiles函数确实会立即返回。

如果forEach顺序读取文件, 则实际上不能使用forEach 。 只需使用现代的for … of循环,在其中await将按预期工作:

async function printFiles () {

const files = await getFilePaths();

for (const file of files) {

const contents = await fs.readFile(file, 'utf8');

console.log(contents);

}

}

如果要并行读取文件, 则实际上不能使用forEach 。 每个async回调函数调用的确会返回一个Promise,但是您将它们扔掉了,而不是等待它们。 只需使用map ,您可以等待Promise.all获得的诺言数组:

async function printFiles () {

const files = await getFilePaths();

await Promise.all(files.map(async (file) => {

const contents = await fs.readFile(file, 'utf8')

console.log(contents)

}));

}

#2楼

npm上的p-iteration模块实现了Array迭代方法,因此可以非常简单地将它们与async / await一起使用。

您的案例的一个例子:

const { forEach } = require('p-iteration');

const fs = require('fs-promise');

(async function printFiles () {

const files = await getFilePaths();

await forEach(files, async (file) => {

const contents = await fs.readFile(file, 'utf8');

console.log(contents);

});

})();

#3楼

上面的两个解决方案都可以工作,但是,安东尼奥用更少的代码来完成这项工作,这就是它如何帮助我从数据库中解析数据,来自几个不同的子引用,然后将它们全部推入数组并以promise的形式解决,完成:

Promise.all(PacksList.map((pack)=>{

return fireBaseRef.child(pack.folderPath).once('value',(snap)=>{

snap.forEach( childSnap => {

const file = childSnap.val()

file.id = childSnap.key;

allItems.push( file )

})

})

})).then(()=>store.dispatch( actions.allMockupItems(allItems)))

#4楼

在文件中弹出几个方法将很轻松,这些方法将以序列化的顺序处理异步数据,并为您的代码提供更传统的风格。 例如:

module.exports = function () {

var self = this;

this.each = async (items, fn) => {

if (items && items.length) {

await Promise.all(

items.map(async (item) => {

await fn(item);

}));

}

};

this.reduce = async (items, fn, initialValue) => {

await self.each(

items, async (item) => {

initialValue = await fn(initialValue, item);

});

return initialValue;

};

};

现在,假设将其保存在“ ./myAsync.js”中,则可以在相邻文件中执行类似于以下的操作:

...

/* your server setup here */

...

var MyAsync = require('./myAsync');

var Cat = require('./models/Cat');

var Doje = require('./models/Doje');

var example = async () => {

var myAsync = new MyAsync();

var doje = await Doje.findOne({ name: 'Doje', noises: [] }).save();

var cleanParams = [];

// FOR EACH EXAMPLE

await myAsync.each(['bork', 'concern', 'heck'],

async (elem) => {

if (elem !== 'heck') {

await doje.update({ $push: { 'noises': elem }});

}

});

var cat = await Cat.findOne({ name: 'Nyan' });

// REDUCE EXAMPLE

var friendsOfNyanCat = await myAsync.reduce(cat.friends,

async (catArray, friendId) => {

var friend = await Friend.findById(friendId);

if (friend.name !== 'Long cat') {

catArray.push(friend.name);

}

}, []);

// Assuming Long Cat was a friend of Nyan Cat...

assert(friendsOfNyanCat.length === (cat.friends.length - 1));

}

#5楼

一个重要的警告是:方法的await + for .. of和forEach + async方式实际上具有不同的效果。

在真实的for循环中await将确保所有异步调用都被一个接一个地执行。 而且forEach + async方式将同时触发所有的Promise,这更快但有时会不知所措( 如果您进行一些数据库查询或访问一些具有音量限制的Web服务,并且不想一次触发100,000个调用)。

如果您不使用async/await并想确保文件被一个又一个地读取,则也可以使用reduce + promise (不太优雅)。

files.reduce((lastPromise, file) =>

lastPromise.then(() =>

fs.readFile(file, 'utf8')

), Promise.resolve()

)

或者,您可以创建一个forEachAsync来提供帮助,但基本上可以使用相同的for循环基础。

Array.prototype.forEachAsync = async function(cb){

for(let x of this){

await cb(x);

}

}

java for循环 等待_在forEach循环中使用异步/等待相关推荐

  1. 【Java开发规范】禁止在 foreach 循环里进行元素的 remove/add 操作

    在阿里巴巴Java开发手册中,有这样一条规定: 但是手册中并没有给出具体原因,本文就来深入分析一下该规定背后的思考. foreach循环 Foreach循环(Foreach loop)是计算机编程语言 ...

  2. python for循环 内存_引用foreach内存

    foreach 引发的值类型与引用类型思考 用都知道的一句话概括:"引用类型在堆上,栈上只保存引用:值类型即可存放于栈上也可存放于堆上,值类型变量直接存储值本身". class P ...

  3. jmeter根据循环获取参数_jmeter forEach循环获取response参数值进行接口请求

    jmeter forEach循环获取response参数值进行接口请求 注意: 一,ForEach控制器 输入变量前缀:输入正则表达式变量的引用名称即可 Start index for loop(ex ...

  4. for循环递减_讲讲关于循环的那些事

    每个人一生中都至少应该获得一次全场起立鼓掌的机会,因为我们都曾胜过这个世界.-R.J.帕拉西奥<奇迹男孩> 导言:希腊哲学家Zeno曾经说"运动是不可能的.由于运动的物体在到达目 ...

  5. c#foreach循环_C#| 使用foreach循环打印整数数组

    c#foreach循环 Given an integer array and we have to print its elements using "foreach loop" ...

  6. python有几种循环语句_[14] Python循环语句(一)

    1. 概述 今天我们介绍循环语句,和条件判断一样,我们从流程图开始看起.首先看一下学习计划列表,粗体为已学,斜体为新增或修改内容.计算机编程的原理简要介绍 集成开发环境PyCharm 变量名.数字.字 ...

  7. 单曲循环 翻译_单曲循环是什么意思

    1. 已经单曲循环这首歌几个小时了. How Could This Be? You Not There With Me. 2. 播放模式也比较完善,有单曲,顺序,循环,随机播放等模式. It has ...

  8. Java中的异步等待

    编写异步代码很困难. 试图了解异步代码应该做什么的难度更大. 承诺是尝试描述延迟执行流程的一种常见方式:首先做一件事,然后再做另一件事,以防万一出错再做其他事情. 在许多语言中,承诺已成为协调异步行为 ...

  9. python processpoolexector 释放内存_一起看看python 中日志异步发送到远程服务器

    在python中使用日志最常用的方式就是在控制台和文件中输出日志了,logging模块也很好的提供的相应的类,使用起来也非常方便,但是有时我们可能会有一些需求,如还需要将日志发送到远端,或者直接写入数 ...

最新文章

  1. 奇怪吸引子---QiChen
  2. extjs4 textfield width
  3. JSON 对象和字符串对象的互转
  4. ML的BD框架-Hadoop.Mahout.Strom.Spark/GraphLab
  5. 通道设置_烟台240家住宅小区、346家重点单位完成消防车通道标识设置
  6. One-Page AlphaGo --十分钟看懂 AlphaGo 的核心算法!
  7. Java进阶之光!mysql安装包安装教程
  8. oracle 数据库安装与使用说明(简略版)
  9. Linux内存管理 (3)内核内存的布局图
  10. oracle matlab函数返回值,如何实现在Oracle中应用存储过程调用MatLab函数(2)
  11. LAMP让开放源代码软件更安全 PHP是例外
  12. 2017华为软挑——最小费用最大流(MCMF)
  13. 录音文件下载_录音啦(文字语音转换)软件安装教程
  14. 软件开源,航芯方案分享 | 全自动咖啡机设计方案
  15. fastjson使用toJSONString时null值不序列化问题
  16. sniffer-agent
  17. RESTful 标准接口教程
  18. k8s(十二)、分布式存储Ceph RBD使用
  19. CSS隐藏滚动条并可以滚动内容
  20. 百度登陆协议分析!!!用libcurl来模拟百度登陆

热门文章

  1. LaTeX 算法代码排版 --latex2e范例总结
  2. Mac 维修前的准备工作你都知道吗?
  3. 怎么用微信公众号领取淘宝诶不优惠券购物教程
  4. mysql 导入 没有数据库文件怎么打开_没有SQL Server数据库时如何打开.MDF文件
  5. 什么是ACL和RBAC
  6. java和javascript有什么区别_javascript与java有什么区别?
  7. assert有什么作用
  8. 仿照浮墨的开源笔记neno
  9. Git-远程仓库【转】
  10. 从IT思维到AI思维系列:2.人工智能概念和应用场景