使用async.js系列识别回调数据

时间:2015-12-15 16:48:51

标签: javascript asynchronous async.js

我使用async.js调用3个运行数据库查询的异步函数,并将其数据返回到下面列出的最终函数的results[]参数中:

async.series([
    function(callback) {
      datasetA.fetch(sqlQueryA).then(function(data) {
        callback(null, data);
      });
    },
    function(callback) {
      datasetB.fetch(sqlQueryB).then(function(data) {
        callback(null, data);
      });
    },
    function(callback) {
      datasetC.fetch(sqlQueryC).then(function(data) {
        callback(null, data);
      });
    }
  ], function(error, results) {
       // Results is array of data containing
       // resultA, resultB, resultC.
  });

我理解所有三个异步函数的结果都在results[]参数中。但是,从每个查询中识别结果的最佳方法是什么?我可以想到三种方式:

1。 Ordinal - resultA将在索引0处,resultB在索引1处,resultC将在index2处。这显然隐含在async.js文档中,但没有明确说明。

2. :在调用async.js callback(null, data)之前修改回调参数:


    async.series([
    function(callback) {
      datasetA.fetch(sqlQuery).then(function(data) {
        data['query'] = 'A';
        callback(null, data);
      });
    },
    function(callback) {
      datasetB.fetch(sqlQuery).then(function(data) {
        data['query'] = 'B';
        callback(null, data);
      });
    },
    function(callback) {
      datasetC.fetch(sqlQuery).then(function(data) {
        data['query'] = 'C';
        callback(null, data);
      });
    }
   ], function(error, results) {
       for (var i=0; i < results.length; i++) {
         // results[i].query will be A, B or C.
       }
    });

3. 检查数据以确定运行了哪个查询。

我不喜欢3,因为它将数据库架构与代码紧密耦合(我只是为了完整性而包含它)。但我不太确定1或2是否更好。由于async.js文档只有暗示结果的顺序反映了数组中异步函数的顺序,所以我倾向于选项2.

最重要的是。为什么我甚至遇到这个问题。也许我错误地使用了async.js库?

1 个答案:

答案 0 :(得分:1)

SO帖子Nodejs async series - pass arguments to next callback中的问题提供了答案。

通过为async.series()提供对象而不是数组,每个异步函数都会成为对象属性,因此具有的即可。密钥可用于识别结果。

应用于我的示例,它看起来像:

async.series({
    A: function(callback){
       datasetA.fetch(sqlQueryA).then(function(data) {
        callback(null, data);
      });
    },
    B: function(callback){
       datasetB.fetch(sqlQueryB).then(function(data) {
        callback(null, data);
      });
    },
    C: function(callback){
        datasetC.fetch(sqlQueryC).then(function(data) {
        callback(null, data);
      });
    }
  },
  function(err, results) {
  // results.A
  // results.B
  // results.C
  });