如何将实时数据作为顺序承诺

时间:2018-06-22 18:04:33

标签: javascript node.js promise

我每秒从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)); 
  }
});

这给了我意外的行为。 注意:这些批次的数据会永远每秒发送一次,因此必须在动态接收下一批之前解决承诺问题

1 个答案:

答案 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')
        });
    });
}