javascript - Node.js 异步模块的复杂用例

标签 javascript node.js asynchronous async.js

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

用例:

我通过回调实现了以下功能:

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.waterfall(    
  A: ...,    
  async.parallel(
      async.waterfall (
          B,
          D
      ),
      async.waterfall (
          C,
          E
      )
   )
) 

最佳答案

尝试使用 auto方法。

Determines the best order for running the functions in tasks, based on their requirements. Each function can optionally depend on other functions being completed first, and each function is run as soon as its requirements are satisfied.

Functions also receive an object containing the results of functions which have completed so far.

例如:

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

关于javascript - Node.js 异步模块的复杂用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32029038/

相关文章:

javascript - 如何从动态数据的 Javascript 设置 CSS

javascript - 查找最接近的单选按钮组的值

node.js - 如何在 typescript 中获得与express的Post方法相同的数据类型

node.js - 从 AWS lambda 函数写入 dynamodb

javascript - 在事件循环为空或超时后退出 Node.js 进程

swift - 如何使用转义闭包和异步调用加载 UI?

javascript - 等待许多异步函数执行

javascript - 通过回调返回ajax?

javascript - 如何将对象转换为对象数组

django - 异步消息队列和处理,如 Django 中的 Amazon Simple Queue 服务