【问题标题】:Complicated use case for Node.js Async ModuleNode.js 异步模块的复杂用例
【发布时间】:2015-11-08 19:55:02
【问题描述】:

我已经开始使用 Node.js 作为我的后端来执行不同的操作,比如 DB 查询/API 调用等。我正在阅读关于 Node.js Async 并决定试一试。它一直适用于我想要一些并行或串行任务的简单用例,但不知何故,我遇到了一个需求,即我需要异步的串行/并行/瀑布技术的最佳组合。

用例:

我用回调实现了以下函数:

function A(input, callback) {
...
callback(err,result);
}


function B(input1, input2, callback) {
...
callback(err,result);
}


function C(input, callback) {
...
callback(err,result);
}


function D(input, callback) {
...
callback(err,result);
}


function E(input, callback) {
...
callback(err,result);
}

它们的执行顺序应该是这样的:

A -> [B -> D]
A -> [C -> E]

  • B,D,C,E 在 A 之后执行。
  • D在B之后执行
  • E在C之后执行
  • B在A之后执行
  • C在A之后执行

  • B,D 和 C,E 不相互依赖,因此可以执行 在 A 完成执行后并行。

  • D依赖于B,应该在B之后执行

  • E 依赖于 C,应在 C 之后执行。

另外,我需要将每个函数的数据传递给它们的依赖函数。因此,A 应该将结果传递给 B 和 C。同样 B 传递给 D,C 传递给 E。

如何使用 Async 模块有效地执行它们?

我想我需要类似但不确定的东西:

async.waterfall(    
  A: ...,    
  async.parallel(
      async.waterfall (
          B,
          D
      ),
      async.waterfall (
          C,
          E
      )
   )
) 

【问题讨论】:

  • 为什么不切换到基于标准的实现 -> ES6 Promises?
  • 您好。我们试图鼓励尽可能简洁的问题。因此,如果您习惯在问题中加上“谢谢”、“请帮帮我”等,那么值得知道这些通常被认为是噪音,并且经常被删掉。
  • @halfer:我会在以后的帖子中记住这一点。

标签: javascript node.js asynchronous async.js


【解决方案1】:

尝试使用auto 方法。

根据任务的要求确定在任务中运行函数的最佳顺序。每个功能都可以选择依赖其他功能先完成,并且每个功能在满足其要求后立即运行。

函数还接收一个对象,其中包含到目前为止已完成的函数的结果。

例如:

async.auto({
  A: function (callback) {
    callback(null, 'A data');
  },
  B: ['A', function (results, callback) {
    // do something with results.A;
    callback(null, 'B data');
  }],
  C: ['A', function (results, callback) {
    // do something with results.A;
    callback(null, 'C data');
  }],
  D: ['A', 'B', function (results, callback) {
    // do something with results.A and results.B;
    callback(null, 'D data');
  }],
  E: ['A', 'C', function (results, callback) {
    // do something with results.A and results.C;
    callback(null, 'E data');
  }]
}, function (err, results) {
  console.log('err = ', err);
});

【讨论】:

    猜你喜欢
    • 2013-11-09
    • 2012-12-04
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2012-08-03
    • 2016-12-23
    • 2017-10-24
    相关资源
    最近更新 更多