同步问题:等到多个 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();
我想从不同的 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();