同步问题:等到多个 fs.readFile 调用完成

Synchronicity problem: Wait until multiple fs.readFile calls complete

我想从不同的 CSV 文件中读取列,并将这些列组合成一个数组。我正在使用 fs.readFile 读取 CSV 文件和处理数据并将新元素推送到列数组的回调。这个列数组然后被发送到软件的另一部分(我正在构建一个电子应用程序,所以它被发送到渲染进程)。

我遇到的问题是 'fs.readFile' 是异步的,因此我的 columns 数组在任何 fs.readFile 调用完成之前就已发送,导致数组为空。

解决此问题的最佳方法是什么?就是简单的用fs.readFileSync?有没有办法在不阻止执行的情况下做到这一点?

下面的最小示例代码:

//Process each column, reading the file and extracting the data one at a time
let columns: (number[] | undefined)[] = []; //Somewhere to store the processed columns
for (const dataHandle of dataHandles)
{
  //read the file as a raw string
  fs.readFile(dataHandle.filePath, (error: any, data: any) => {
    if (error) {
      console.log("Error reading file:", error);
    } else {
      data = data.toString();
      const newColumn = parseColumnFromStringDataframe(data, dataHandle.columnName);
      columns.push(newColumn);
    }
  })
}
//Finished processing each column, so send response.
//BUT... readfile is non-blocking! Sends the response before anything is pushed to columns! How can we wait in a smart way?
console.log(columns); // []
mainWindow?.webContents.send("readDataProductColumnsResponse", columns); //Sends response

此处已回答:

基本上你必须创建一个承诺数组,然后调用 Promise.all(promises);

const fs = require("fs");
const files = ["app.js", "index.html", "script.js"];

const readAllFiles = async () => {
  let promises = [];
  for (const f of files) {
    promises.push(fs.promises.readFile(f, "utf8"));
  }
  return Promise.all(promises);
};

async function run() {
  readAllFiles()
    .then((fileContents) => {
      console.log("done", fileContents);
      // fileContents is an array that contains all the file contents as strings
    })
    .catch((err) => {
      console.error(err);
    });
}

run();