Node.js 异步模块的复杂用例
Complicated use case for Node.js Async Module
我已经开始使用 Node.js 作为我的后端来执行不同的操作,例如数据库查询/ API 调用等。我正在阅读 Node.js Async 并决定试一试。它一直在为简单的用例工作,在这些用例中,我想要并行或串行执行一些任务,但不知何故,我遇到了一个要求,我需要 series/parallel/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);
});
我已经开始使用 Node.js 作为我的后端来执行不同的操作,例如数据库查询/ API 调用等。我正在阅读 Node.js Async 并决定试一试。它一直在为简单的用例工作,在这些用例中,我想要并行或串行执行一些任务,但不知何故,我遇到了一个要求,我需要 series/parallel/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);
});