我有一个文件,我通过line-by-line npm包逐行读取。我想在我的数据库中存储每一行(如果该行符合我的条件..)。我想异步地存储它,但也要等待数据库中的所有保存操作完成,然后再继续下一个操作。
这是我目前的代码:
const fs = require('fs');
const path = require('path');
const LineByLineReader = require('line-by-line');
const moment = require('moment');
const saveFunc = async (filePath) => {
const savePromises = [];
const LBLR = new LineByLineReader(filePath);
LBLR.on('error', (error) => {
throw (error);
});
LBLR.on('line', async (line) => {
let lineJSON;
try {
lineJSON = JSON.parse(line);
} catch (e) { } // Just skip the line if cannot be parsed
if (!!lineJSON && 'caseId' in lineJSON && 'timestamp' in lineJSON && 'message' in lineJSON) {
if (lineJSON['message'] === "Socket.io 'connection' event") {
const logDateString = (lineJSON['timestamp'].split(' '))[0];
const logTimestamp = moment(logDateString, 'DD-MM-YYYY').toDate();
savePromises.push(new LivenessLog({
caseId: lineJSON['caseId'],
eventName: 'connect',
timestamp: logTimestamp,
}).save());
}
}
});
await new Promise((resolve) => {
LBLR.on('end', resolve);
});
await Promise.all(savePromises);
}
await saveLivenessLogs('..'); // X OPERATION -- !! --因此,基本上,我希望立即执行.save()操作(当前不会执行,因为我将它的承诺推送给数组,所以只在执行时执行它)但是,只有在成功地执行了所有X OPERATION操作之后,我才想返回到.save()。
发布于 2020-10-29 20:29:00
您需要在.then之后使用.save(),以便它能够立即执行(您想要的异步行为)
但同时,我们需要将结果承诺推送给savePromises数组,以便您可以在Promise.all的末尾使用它来确认所有查询都运行。
请试试这样的东西。
savePromises.push(new LivenessLog({
caseId: lineJSON['caseId'],
eventName: 'connect',
timestamp: logTimestamp,
}).save().then(data => { return data; }));https://stackoverflow.com/questions/64595863
复制相似问题