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

标签 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. 序数 - 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.
       }
    });

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

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

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

最佳答案

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

通过为async.series()提供对象而不是数组,每个异步函数都成为一个对象属性 因此有一个 key 。 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
  });

关于javascript - 使用 async.js 系列识别回调数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34294869/

相关文章:

javascript - Promise在这种情况下如何实现?

javascript - Bluebird Promise 和 async.forEach 迭代

javascript - 尽管使用了 Async 模块,为什么这些函数仍然异步执行

javascript - Protractor :非 Angular 登录到 Angular 站点

javascript - WinJS虚拟化数据源+嵌套异步请求

javascript - 正则表达式将 _ 替换为\_ 内的美元符号

javascript - 为 javascript、jQuery 中的异步函数链参数化变量回调

javascript - 如何按数组内容的顺序执行 async.map 函数

javascript - Angular Directive(指令)中无法访问多个属性

javascript - 为什么使用目标 ="_blank"会导致 Javascript 失败?