我有一堆带有此签名的函数:
var plugins = [
function f1( fileData, fileInfo, cb ){
/* Manipulate fileData */
fileData += "f1 ran! ";
cb( null, fileData );
},
function f2( fileData, fileInfo, cb ){
/* Manipulate fileData */
fileData += "f2 ran! ";
cb( null, fileData );
}
];
我想按顺序运行所有这些,并获得最终结果。
目前,我正在使用async.waterfall
:
var async = require( 'async');
var pluginsWithStarter = [ function( cb ){
return cb( null, fileData, fileInfo );
} ].concat( plugins );
var fileData = "Some example data";
var fileInfo =
async.waterfall( pluginsWithStarter, function( err, fileData, fileInfo){
if( err ) return cb( err );
console.log("RESULT: ");
console.log( fileData );
console.log( fileInfo );
cb( null );
});
请注意,使用此方法,插件将被强制使用两个参数调用回调:return cb( null, fileData, fileInfo );
。
基本上,我向瀑布附加一个“启动”功能,它将使用两个初始参数运行 - 所有其他函数将处理并返回。
问题:
1)这是使用async.waterfall的好方法吗?我希望它能够自己接受第一个参数,例如:async.waterfall( pluginsWithStarter, fileData, fileInfo, function( err, fileData, fileInfo){
但是,不,你必须有一个不带参数的第一个函数,然后返回带有几个参数的回调
2)这样我就不得不让每个函数都返回BOTH值,这有点难看。我怎么能改变代码,以便插件只需要用一个参数调用回调?
答案 0 :(得分:0)
来自async ticket on GitHub(我在三天后打开它
1:是的,这是一种使用瀑布的好方法 - 让第一个函数成为一个设置参数的简单函数。另一种选择是执行plugins[0] = plugins[0].bind(null, fileData, fileInfo);
之类的操作来部分应用第一个函数。
我也在考虑将acomb.constant
添加到异步中,以使第一个函数的创建更简单:
var pluginsWithStarter = [async.constant(fileData, fileInfo)].concat(plugins);
行。
2:我听说你必须通过瀑布传递一切。您可以将变量放在父闭包范围中,以防止必须通过瀑布手动传递所有内容。您还可以查看async.auto
以管理异步工作流中的许多变量。它的界面有点奇怪,我承认......