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

Identifying callback data with async.js series

我正在使用 async.js 调用 3 个异步函数,这些函数 运行 数据库查询和 return 它们在下面列出的最终函数的 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. 序数 - resultA 位于索引 0,resultB 位于索引 1,resultC 位于索引 2。 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.
       }
    });
</pre>

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

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

高于一切。为什么我什至有这个问题。也许我使用的 async.js 库不正确?

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

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

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

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
  });