我有以下方法,在该方法中,我从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);
}
如有任何帮助,我们将不胜感激!
几个指针,希望这能帮助明确方法。
createReadStream
返回一个ReadableStream
,而不是等待的异步/承诺- 返回的
ReadableStream
提供了对事件作出反应的方法,如使用on
对处理程序进行流水线操作时所示
现在,如果将代码包装在Promise
中,其中resolve
或reject
分别基于end
或error
事件。
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);
}