使用异步

时间:2015-06-23 09:40:28

标签: 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 += "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值,这有点难看。我怎么能改变代码,以便插件只需要用一个参数调用回调?

1 个答案:

答案 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以管理异步工作流中的许多变量。它的界面有点奇怪,我承认......