异步.应用于async.waterfall内部

async.apply inside async.waterfall

本文关键字:内部 waterfall async 应用于 异步      更新时间:2023-09-26

我有以下代码片段

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),这是不好的。

我想知道是否有一种方法可以只使用。bind()或。apply()这样的函数来做到这一点。

不使用原生函数,或者似乎只使用async的函数。正如您所注意到的,需要flip each函数。部分应用程序的某些实现(如Underscore)允许使用中间参数,但您需要显式地包含它们。

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')