forEach循环中使用async/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,所以我只是想问一下这是否有任何问题.

推荐答案

当然,代码确实有效,但我非常确定它没有达到你期望的效果.它只会触发多个异步调用,但printFiles函数会立即返回.

按顺序阅读

如果您想按顺序阅读这些文件,确实是you cannot use 100.只需使用现代的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);
  }
}

平行阅读

如果您想并行读取这些文件,请确实使用you cannot use 100.async个回调函数调用中的每个都返回一个promise ,但是您是在丢弃它们,而不是等待它们.只需使用map代替,您就可以等待使用Promise.all得到的一系列promise :

async function printFiles () {
  const files = await getFilePaths();

  await Promise.all(files.map(async (file) => {
    const contents = await fs.readFile(file, 'utf8')
    console.log(contents)
  }));
}

Javascript相关问答推荐

序列查找器功能应用默认值而不是读取响应

如何为GrapesJS模板编辑器创建自定义撤销/重复按钮?

如何避免移动设备中出现虚假调整大小事件?

单击更新页面的按钮后,页面刷新;测试/断言超时,有两个标题,但没有一个标题

vscode扩展-webView Panel按钮不起任何作用

如何从JSON数组添加Google Maps标记—或者如何为数组添加参数到标记构造器

给定一个凸多边形作为一组边,如何根据到最近边的距离填充里面的区域

如何将Map字符串,布尔值转换为{key:string;value:bo布尔值;}[]?<>

如何在模块层面提供服务?

我怎么才能得到Kotlin的密文?

使用ThreeJ渲染的形状具有抖动/模糊的边缘

如何在Node.js中排除导出的JS文件

一个实体一刀VS每个实体多刀S

<;img>;标记无法呈现图像

对具有相似属性的对象数组进行分组,并使用串连的值获得结果

将Singleton实例设置为未定义后的Angular 变量引用持久性行为

如何在每隔2分钟刷新OKTA令牌后停止页面刷新

为什么当雪碧的S在另一个函数中时,Phaser不能加载它?

如何调整下拉内容,使其不与其他元素重叠?

当一条路由在Reaction路由中命中时,如何有条件地渲染两个组件或更改两个插座?