Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用async运行多个异步筛选器函数_Javascript_Node.js_Asynchronous - Fatal编程技术网

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污染太大而无法使用?