Nodejsasynchronous系列 – 传递参数到下一个callback
当你使用asynchronous模块时,你怎样才能把前一个callback的parameter passing给下一个呢?
这里是一个来自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} });
您可以将asynchronous函数与asynchronous模块的waterfall
函数链接在一起。 这可以让你说:“首先做x,然后把结果传递给y,然后把结果传给z。 从文档复制:
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' });
你不需要严格的asynchronous模块来完成这个任务; 此function旨在使代码更容易在眼睛上。 如果你不想使用asynchronous模块,你总是可以使用传统的callback。
另一个select是使用async.auto 。 使用asynchronous自动,您可以指定任务的依赖关系数据,asynchronous将在能够时开始运行。 在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} }]; });
我花了相当多的时间来解决这个问题,因为我遇到了类似的情况。 我尝试了async.series
和async.waterfall
。
async.series
:使用一个variables来共享callback函数。 我不确定这是否是最好的办法。 我必须赞扬塞巴斯蒂安关于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(); } ); };
async.waterfall
:我尝试使用另一个callback函数使用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); };
PS : 信用 。