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);    
    }
  })
}