Javascript 从节点中的多个异步文件读取创建承诺?

Javascript 从节点中的多个异步文件读取创建承诺?,javascript,node.js,Javascript,Node.js,如果我们有: fn1() { [filepath1, filepath2, ..., filepathN].forEach(process); function process(path) { fs.readFile(file, translate); } } translate回调对每个文件的内容进行操作 我们如何使此返回成为一个承诺,以便我们能够执行fn1()。然后(fn2) 如果有一个使用async wait的好解决方案,那也太好了 假设 fn2()需

如果我们有:

fn1() {
   [filepath1, filepath2, ..., filepathN].forEach(process);

   function process(path) {
       fs.readFile(file, translate);
   }
}
translate
回调对每个文件的内容进行操作

我们如何使此返回成为一个承诺,以便我们能够执行
fn1()。然后(fn2)

如果有一个使用
async wait
的好解决方案,那也太好了

假设
  • fn2()
    需要等待,直到处理完
    fn1
    使用的数组中的所有文件路径
  • fn1()
    可能会在处理完所有文件之前返回,因为fs.readFile()是异步的…IIUC? `

您可以在
for..of
循环中使用
wait

async fn1() {
  for (path of [filepath1, filepath2, ..., filepathN]) {
    await new Promise((resolve) => {
      fs.readFile(path, (err, data) => {
        translate(err, data);
        resolve();
      });
    });
  }
}
fn1
,作为一个异步函数,将自动返回一个承诺,该承诺在所有迭代完成后解析,因此您可以使用
fn1()。然后(fn2)

如果您想并行而不是串行地
readFile
,那么最好将每个
readFile
调用成一个承诺数组,然后使用
Promise。所有

fn1() {
  const arr = [filepath1, filepath2, ..., filepathN];
  return Promise.all(arr.map(path => new Promise((resolve) => {
    fs.readFile(path, (err, data) => {
      translate(err, data);
      resolve();
    });
  })));
}

这家伙是个疯狂的极客:)