我每秒从Apache Kafka消息队列中接收一批实时数据,对于每一批我都需要在我的应用程序中运行数据库查询。在处理下一批数据之前,对上一批的所有查询都至关重要。但是,每批查询的执行顺序无关紧要。由于异步,这要困难得多。
batchOfRows.on('message', function (data) {
for (var i = 0; i < batchOfRows.rows.length; i++) {
query(batchOfRows.rows[i])
.then(result => console.log(result))
.catch(error => console.log(error));
}
});
这给了我意外的行为。 注意:这些批次的数据会永远每秒发送一次,因此必须在动态接收下一批之前解决承诺问题
答案 0 :(得分:1)
启动承诺链。
let promises = Promise.resolve();
每批到达时,在其链上附加一个承诺以对该批次进行处理...
batchOfRows.on('message', function (data) {
promises = promises.then(function() {
let batch = batchOfRows.rows.map(function(row) {
return query(row);
});
return Promise.all(batch).then(function(result) {
// do something for each completed batch
console.log('completed a batch')
});
});
}