1

我有以下代码片段

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()or之类的函数来执行此操作.apply()

我曾考虑过使用.bind()then.apply()但这会导致function(loadDataFromFile, files, callback)which 不行。

4

1 回答 1

5

我想知道是否有一种方法可以仅使用 .bind() 或 .apply() 之类的函数来执行此操作。

不只使用本机功能,或者只使用async它看起来的功能。正如您所注意到的,您需要使用flipeach功能。部分应用程序的某些实现(如下划线)允许中间参数,但您需要显式包含它们。

一个lodash 的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').

于 2014-03-28T14:08:03.583 回答