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

Javascript Node.js异步模块的复杂用例,javascript,node.js,asynchronous,async.js,Javascript,Node.js,Asynchronous,Async.js,我已经开始使用Node.js作为我的后端来执行不同的操作,如DB查询/API调用等。我正在阅读Node.js的相关内容,并决定尝试一下。它一直适用于一些简单的用例,在这些用例中,我希望并行或串行执行一些任务,但不知何故,我遇到了一个需求,需要异步的串行/并行/瀑布技术的最佳组合 用例: 我使用回调实现了以下功能: function A(input, callback) { ... callback(err,result); } function B(input1, input2, callb

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

用例:

我使用回调实现了以下功能:

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
      )
   )
) 
尝试使用这种方法

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

函数还接收一个对象,其中包含迄今为止已完成的函数的结果

例如:

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

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