NodeJS - 等到流式传输多个文件完成后再继续代码
NodeJS - Wait Until Streaming Multiple Files Is Complete Before Continuing Code
我是 Javascript 和 NodeJS 的新手。我试图在对它们进行一些处理之前读取多个 CSV 文件。我当前的问题是当我 运行 它试图在文件读取完成之前执行处理的代码。我想在开始对它们进行任何处理之前加载这两个 CSV。
有人可以解释为什么会发生这种情况以及我如何解决 Javascript/NodeJS 中的问题。
function readCSV(path){
var events = []
fs.createReadStream(path).pipe(csv()).on('data', (row) => {
events.push(row);
}).on('end', () => {
console.log('CSV file successfully processed. Length: ' + events.length);
});
return events
}
function app(){
var file_list = listFiles(folder_path);
for (let i = 0; i < file_list.length; i++) {
const file = file_list[i];
var events = readCSV(file)
}
processCSV(events) // Some processing
}
app();
任何帮助都将非常有用,任何关于我如何控制何时执行代码的解释将不胜感激。
抱歉,您的代码无法编译,所以只能用未经测试的代码回答
My current issue is when I run the code it tries to execute the processing before the reading of the file is complete.
fs.createReadStream
不读取文件的主要问题 - 它请求文件系统开始读取并在读取某些块时通知您的回调
所以事件 'end' 稍后将被称为匹配,当 readCSV
将完成并且 return 为空结果
你写的代码就像你期望同步答案一样,你可以通过使用 fs.readFileSync
等同步方法使其正常工作
如何以异步方式修复它?在“on(end)”回调中写入 csv 处理或使用 promises
Promise 匹配更简单和线性
首先对 return Promise
进行 readCSV
function readCSV(path: string){ //return Promise<any[]>
return new Promise((resolve) => {
var events = [];
fs.createReadStream(path)
.pipe(csv())
.on('data', (row) => {
// this code called in future
events.push(row);
}).on('end', () => {
// this code called in future to,
console.log('CSV file successfully processed. Length: ' + events.length);
resolve(events); //return csv parsed result
});
})
}
然后在主应用程序中,使用Promise.all等待所有文件读取承诺
function app(){
// i don't know what is listFiles,
// i hope it returns sync result
var file_list = fs.listFiles(folder_path);
const dataPromises: Promise[] = []
for (let i = 0; i < file_list.length; i++) {
const file = file_list[i];
//launch reading
dataPromises.push(readCSV(file))
}
Promise.all(dataPromises).then(result => {
//this code will be called in future after all readCSV Promises call resolve(..)
for(const events of result){
processCSV(events);
}
})
}
我是 Javascript 和 NodeJS 的新手。我试图在对它们进行一些处理之前读取多个 CSV 文件。我当前的问题是当我 运行 它试图在文件读取完成之前执行处理的代码。我想在开始对它们进行任何处理之前加载这两个 CSV。
有人可以解释为什么会发生这种情况以及我如何解决 Javascript/NodeJS 中的问题。
function readCSV(path){
var events = []
fs.createReadStream(path).pipe(csv()).on('data', (row) => {
events.push(row);
}).on('end', () => {
console.log('CSV file successfully processed. Length: ' + events.length);
});
return events
}
function app(){
var file_list = listFiles(folder_path);
for (let i = 0; i < file_list.length; i++) {
const file = file_list[i];
var events = readCSV(file)
}
processCSV(events) // Some processing
}
app();
任何帮助都将非常有用,任何关于我如何控制何时执行代码的解释将不胜感激。
抱歉,您的代码无法编译,所以只能用未经测试的代码回答
My current issue is when I run the code it tries to execute the processing before the reading of the file is complete.
fs.createReadStream
不读取文件的主要问题 - 它请求文件系统开始读取并在读取某些块时通知您的回调
所以事件 'end' 稍后将被称为匹配,当 readCSV
将完成并且 return 为空结果
你写的代码就像你期望同步答案一样,你可以通过使用 fs.readFileSync
如何以异步方式修复它?在“on(end)”回调中写入 csv 处理或使用 promises
Promise 匹配更简单和线性
首先对 return Promise
进行 readCSVfunction readCSV(path: string){ //return Promise<any[]>
return new Promise((resolve) => {
var events = [];
fs.createReadStream(path)
.pipe(csv())
.on('data', (row) => {
// this code called in future
events.push(row);
}).on('end', () => {
// this code called in future to,
console.log('CSV file successfully processed. Length: ' + events.length);
resolve(events); //return csv parsed result
});
})
}
然后在主应用程序中,使用Promise.all等待所有文件读取承诺
function app(){
// i don't know what is listFiles,
// i hope it returns sync result
var file_list = fs.listFiles(folder_path);
const dataPromises: Promise[] = []
for (let i = 0; i < file_list.length; i++) {
const file = file_list[i];
//launch reading
dataPromises.push(readCSV(file))
}
Promise.all(dataPromises).then(result => {
//this code will be called in future after all readCSV Promises call resolve(..)
for(const events of result){
processCSV(events);
}
})
}