我的目标是按顺序执行一些javascript函数,其中一个函数的结果经常(但不总是)用作另一个函数的参数。
var async = require('async');
var commonFunction1 = function(arg1, arg2, callback) { // callback(err, res1, res2)
callback(null, arg1 + arg2, 11);
}
var commonFunction2 = function(arg3, arg4, callback) { // callbackb(err, res3, res4)
callback(null, arg3 + arg4, 90);
}
var argument1 = 1,
argument2 = 2,
result1,
result2,
result3,
result4;
async.series({
1: function(cb) {
commonFunction1(argument1, argument2, function(err, res1, res2) {
result1 = res1;
result2 = res2;
cb(err);
});
},
2: function(cb) {
commonFunction2(result1, result2, function(err, res3, res4) {
result3 = res3;
result4 = res4;
cb(err);
});
},
}, function(err, results) {
console.log(err, result1, result2, result3, result4);
});
如您所见,类似的语句result1 = res1
是强制语法糖。
有没有更好的方法来链接局部变量和回调函数参数?
PS闭包是不是我的方式,因为我计划迁移commonFunction1
并commonFunction2
到另一个模块。
按预期使用系列,仅将一个结果传递给下一个回调:
async.series([function(next) {
commonFunction1(argument1, argument2, function(err, res1, res2) {
next(err,{result1:res1,result2:res2});
});
,
function(next) {
commonFunction2(result1, result2, function(err, res3, res4) {
next(err,{result3:res3,result4:res4});
});
}],function(err,results){
var finalObject= results.reduce(function(res,next){
Object.keys(next).forEach(function(k){
res[k]=next[k];
});
return res;
},{});
console.log(finalObject);
});
我建议您更好地构建commFunctions并返回带有属性的对象,而不是将2结果与错误一起传递。
var commonFunction1 = function(arg1, arg2, callback) { // callback(err, res1, res2)
callback(err, {prop1:arg1 + arg2, prop2:11} );
}
这是nodejs中的最佳实践,只需查看异步核心功能,即可使您的代码更易于使用。这样,您就不必在最终的async.series回调中编写所有reduce代码,只需使用结果数组即可。
编辑:如我的评论所述,async.waterfall会更好地适合您的用例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句