Javascript 使用async运行多个异步筛选器函数
我有一系列具有此签名的函数:Javascript 使用async运行多个异步筛选器函数,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我有一系列具有此签名的函数: var plugins = [ function f1( fileData, fileInfo, cb ){ /* Manipulate fileData */ fileData += "f1 ran! "; cb( null, fileData ); }, function f2( fileData, fileInfo, cb ){ /* Manipulate fileData */ fileData +=
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.failter
:
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 );
});
注意,使用这个方法,插件被强制调用带有两个参数的回调:returncb(null,fileData,fileInfo)代码>
基本上,我在瀑布中添加了一个“starter”函数,它将使用两个初始参数运行——所有其他函数都将处理并返回这两个参数
问题:
1) 这是使用async.瀑布的好方法吗?我希望它能够自己接受第一个参数,比如:async.failter(pluginwithstarter,fileData,fileInfo,function(err,fileData,fileInfo){
但是,不,必须有第一个不带参数的函数,然后返回带有多个参数的回调
2) 通过这种方式,我被迫让每个函数都返回两个值,这有点难看。我如何更改代码,使插件只需使用一个参数调用回调?(我在三天后打开了它)
1:是的,这是使用瀑布的好方法——让第一个函数是设置参数的简单函数。另一个选项是执行类似plugins[0]=plugins[0]。bind(null,fileData,fileInfo);
的操作以部分应用第一个函数
我还考虑将acomb.constant
添加到async中,以简化第一个函数的创建:
var pluginsWithStarter = [async.constant(fileData, fileInfo)].concat(plugins);
嗯
2:我听说你必须通过瀑布传递所有信息。你可以将变量放在父闭包范围内,以避免手动通过瀑布传递所有信息。你还可以查看async.auto
来管理异步工作流中的许多变量。我承认,它的界面有点奇怪…三天后我打开了它
1:是的,这是使用瀑布的好方法——让第一个函数是设置参数的简单函数。另一个选项是执行类似plugins[0]=plugins[0]。bind(null,fileData,fileInfo);
的操作以部分应用第一个函数
我还考虑将acomb.constant
添加到async中,以简化第一个函数的创建:
var pluginsWithStarter = [async.constant(fileData, fileInfo)].concat(plugins);
嗯
2:我听说你必须通过瀑布传递所有信息。你可以将变量放在父闭包范围内,以避免手动通过瀑布传递所有信息。你还可以查看async.auto
来管理异步工作流中的许多变量。我承认,它的界面有点奇怪…Reading这让我非常高兴我改用了承诺(via),特别是在理解了(多亏了)一个链中的每个函数之后。然后链返回(1)一个承诺,(2)一个值或(3)抛出一个错误。我很高兴你很高兴。另一方面,我永远不会用承诺污染服务器端代码。我正在使用RejectionDB,它的节点驱动程序支持回调或承诺。你会使用回调,还是RejectionDB污染太大而无法使用?读了这篇文章,我真的很高兴我改用承诺(via),尤其是在理解(由于)一个链中的每个函数之后,
链返回(1)一个承诺,(2)一个值,或(3)抛出一个错误。我很高兴你很高兴。另一方面,我永远不会用承诺污染服务器端代码。我正在使用RejectionDB,它的节点驱动程序支持回调或承诺。你会使用回调,还是RejectionDB污染太大而无法使用?