如何在转移到另一个进程之前解决异步进程



我有以下方法,在该方法中,我从csv中读取并收集字符串数组中的数据。完成后,我想使用该数组。我是处理异步调用的新手,我认为下面代码中发生的事情是,从.csv文件中读取是异步的,所以一旦我开始循环遍历数组,数组就会为空。我如何完成.csv读取,以便所有数组都被完全填充,直到它被填充为止,然后继续下一个循环遍历数组的任务?

static async readAndPopulateGMDevicesToMigrate() {
const bookTitles = [];
await fs.createReadStream('./BookTitles.csv')
.pipe(csv())
.on('data', (data) => bookTitles.push(data.Titles))
.on('error', (error) => loggingService.getDefaultLogger().error(error))
.on('end', () => loggingService.getDefaultLogger().info("Book Titles:" + booksTitles));

console.log(bookTitles);
const booksToAdd = [];

bookTitles.forEach(bookTitle => booksToAdd.push(new Object({
Title: bookTitle}))),
})))

console.log(readDevices);
}

如有任何帮助,我们将不胜感激!

几个指针,希望这能帮助明确方法。

  1. createReadStream返回一个ReadableStream,而不是等待的异步/承诺
  2. 返回的ReadableStream提供了对事件作出反应的方法,如使用on对处理程序进行流水线操作时所示

现在,如果将代码包装在Promise中,其中resolvereject分别基于enderror事件。

static async readAndPopulateGMDevicesToMigrate() {
const bookTitles = [];
const logger = loggingService.getDefaultLogger();
/* WRAP in promise to wait */
await new Promise((resolve, reject) => {
fs.createReadStream('./BookTitles.csv')
.pipe(csv())
.on('data', ({ Titles }) => {
logger.info(`Adding ${Titles} Titles`);
bookTitles.push(Titles);
})
.on('error', (error) => {
logger.error(error);
/* REJECT on error, maybe reject with the partial result ? */
reject(error);
})
.on('end', () => {
logger.info("Book Titles:" + booksTitles);
const booksToAdd = bookTitles.map(bookTitle => ({Title: bookTitle}));
/* RESOLVE when the stream was read to the end */
resolve(booksToAdd);
});

})
console.log(bookTitles);    
console.log(readDevices);
}

相关内容

最新更新