我有一堆有签名的函数:
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)通过这种方式,我不得不让每个函数都返回这两个值,这有点不太好。如何更改代码,使插件只需使用一个参数调用回调?
发布于 2015-06-28 05:04:06
从GitHub上的异步票据 (我在三天后打开它)
他说:是的,这是一个使用瀑布的好方法--第一个函数是一个简单的函数,可以设置参数。另一种选择是执行类似plugins[0] = plugins[0].bind(null, fileData, fileInfo);的操作,以部分应用第一个函数。
我还考虑将acomb.constant添加到异步,以便简化第一个函数的创建:
var pluginsWithStarter = [async.constant(fileData, fileInfo)].concat(plugins);好的。
他说:我听说你必须把所有的东西都通过瀑布。您可以将变量放入父闭包作用域中,以避免手动通过瀑布传递所有内容。您还可以查看async.auto来管理异步工作流中的许多变量。它的界面有点奇怪,我承认.
https://stackoverflow.com/questions/30999229
复制相似问题