在forEach
循环中使用async/await
是否有问题?我试图遍历一个文件数组,并对每个文件的内容使用await
。
import fs from 'fs-promise'
async function printFiles() {
const files = await getFilePaths(); // 假设这没问题
files.forEach(async (file) => {
const contents = await fs.readFile(file, 'utf8');
console.log(contents);
});
}
printFiles();
这段代码确实可以工作,但这样使用是否有问题呢?我听有人说,像这样的高级函数中不应该使用async/await
,所以我只是想知道是否有问题。
当然,这段代码确实可以工作,但我确信它并没有按照你的期望来执行。它只是触发了多个异步调用,但在那之后printFiles
函数会立即返回。
按顺序读取
如果你想按顺序读取文件,确实不能使用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
等待你将获得一个包含所有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)
}));
}
标签:files,const,await,forEach,async,contents
From: https://www.cnblogs.com/xiaomandujia/p/17799016.html