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

How to resolve asynchronous process before moving onto another process?

我有以下方法,我从 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 returns ReadableStream,而不是等待的 async/promise。
  2. 返回的 ReadableStream 提供了对事件做出反应的方法,如使用 on.
  3. 对处理程序进行流水线化时所示

现在,如果您将代码包装在 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);
}