当您使用异步模块时,如何将前一个回调中的参数传递给下一个?
以下是github上的文档示例
async.series({
one: function(callback){
setTimeout(function(){
callback(null, 1);
}, 200);
},
two: function(callback){
setTimeout(function(){
callback(null, 2);
}, 100);
}
},
function(err, results) {
// results is now equal to: {one: 1, two: 2}
});
Run Code Online (Sandbox Code Playgroud)
Ale*_*xMA 86
您可以使用异步模块的waterfall功能将异步函数链接在一起.这允许你说,"先做x,然后将结果传递给函数y,并将结果传递给z." 复制自[docs] [1]:
async.waterfall([
function(callback){
callback(null, 'one', 'two');
},
function(arg1, arg2, callback){
// arg1 now equals 'one' and arg2 now equals 'two'
callback(null, 'three');
},
function(arg1, callback){
// arg1 now equals 'three'
callback(null, 'done');
}
], function (err, result) {
// result now equals 'done'
});
Run Code Online (Sandbox Code Playgroud)
您并不需要async模块来完成此任务; 此功能旨在使代码更易于阅读.如果您不想使用异步模块,则始终可以使用传统的回调.
Mik*_*raf 16
另一种选择是使用async.auto.使用async auto,您可以指定任务的依赖关系数据,async将在能够时开始运行它.README.md中有一个很好的例子,但这里大致是你上面的系列:
async.auto({
one: function(callback){
setTimeout(function(){
callback(null, 1);
}, 200);
},
// If two does not depend on one, then you can remove the 'one' string
// from the array and they will run asynchronously (good for "parallel" IO tasks)
two: ['one', function(callback, results){
setTimeout(function(){
callback(null, 2);
}, 100);
}],
// Final depends on both 'one' and 'two' being completed and their results
final: ['one', 'two',function(err, results) {
// results is now equal to: {one: 1, two: 2}
}];
});
Run Code Online (Sandbox Code Playgroud)
小智 9
我花了很多时间来解决这个问题,因为我遇到了类似的情况.我想这两个async.series和async.waterfall.
async.series:
使用变量在回调函数之间共享.我不确定这是否是最好的方法.我必须赞扬塞巴斯蒂安的精彩文章async.
var async1 = require('async');
exports.asyncSeries1 = function (req, res, callback) {
var sharedData = "Data from : ";
async1.series([
// First function
function(callback) {
sharedData = "First Callback";
callback();
},
// Second function
function(callback){
console.log(sharedData);
sharedData = "Second Callback";
callback();
}
],
// Final callback
function(err) {
console.log(sharedData);
if (err) {
callback();
}
callback();
}
);
};
Run Code Online (Sandbox Code Playgroud)
async.waterfall:我尝试使用另一个回调函数async.apply.这是帮助我解决问题的代码片段.`
var async2 = require('async')
exports.asyncWaterfall1 = function (arg1, arg2, cb) {
async2.waterfall([
// async.apply
async2.apply(assignVariables, arg1, arg2),
// First callback
function(arg1, arg2, callback){
console.log(arg1);
console.log(arg2);
arg1 = 5;
arg2 = 6;
callback(null, arg1, arg2);
},
// Second callback
function(arg1, arg2, callback){
// arg1 now equals 'one' and arg2 now equals 'two'
console.log(arg1);
console.log(arg2);
arg1 = 7;
arg2 = 8;
callback(null, arg1, arg2);
}
],
function (err, arg1, arg2) {
console.log(arg1);
console.log(arg2);
});
};
// Method to assign variables
function assignVariables(arg1, arg2, callback) {
console.log(arg1);
console.log(arg2);
arg1 = 3;
arg2 = 4;
callback(null, arg1, arg2);
};
Run Code Online (Sandbox Code Playgroud)
PS:信用.
| 归档时间: |
|
| 查看次数: |
44931 次 |
| 最近记录: |