async.apply在async.waterfall中

时间:2014-03-28 13:33:11

标签: javascript node.js node-async

我有以下代码片段

async.waterfall([
  // Read directory
  async.apply(fs.readdir, '../testdata'),
  // Load data from each file
  function(files, callback) {
    async.each(files, loadDataFromFile, callback);
  }
], function(err) {
  if (err) {
    api.logger.error('Error while inserting test data', err);
  }
  next();
});

有没有办法可以取代这件作品:

function(files, callback) {
  async.each(files, loadDataFromFile, callback);
}

只是一个功能?就像我上面所做的那样,使用async.apply()我替换了这个:

function(callback) {
  fs.readdir('../testdata', callback);
}

我知道我可以创建自己的辅助函数来执行此操作,或者我可以这样做,但我想知道是否有办法只使用.bind().apply()这样的函数

我考虑使用.bind()然后使用.apply(),但这会导致function(loadDataFromFile, files, callback)不正常。

1 个答案:

答案 0 :(得分:5)

  

我想知道是否有办法只使用.bind()或.apply()这样的函数。

不仅使用本机功能,或仅使用来自async的功能。您已经注意到,需要flip each函数。部分应用程序的某些实现(如Underscore)允许使用中间参数,但您需要明确包含它们。

lodash's partialRight的示例:

async.waterfall([
  _.partial(fs.readdir, '../testdata'), // Read directory
  _.partialRight(async.each, loadDataFromFile), // Load data from each file
], function(err) {
  if (err)
    api.logger.error('Error while inserting test data', err);
  next();
});

可能您需要bind方法到正确的上下文,例如fs.readdir.bind(fs, '../testdata')