如何在转移到另一个进程之前解决异步进程?
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);
}
如有任何帮助,我们将不胜感激!
几点建议,希望这有助于弄清楚方法。
createReadStream
returns ReadableStream
,而不是等待的 async/promise。
- 返回的
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);
}
我有以下方法,我从 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
returnsReadableStream
,而不是等待的 async/promise。- 返回的
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);
}