async.apply在async.waterfall中

alu*_*ian 1 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();
});
Run Code Online (Sandbox Code Playgroud)

有没有办法可以替换这件作品:

function(files, callback) {
  async.each(files, loadDataFromFile, callback);
}
Run Code Online (Sandbox Code Playgroud)

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

function(callback) {
  fs.readdir('../testdata', callback);
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以创建自己的辅助函数来做到这一点,或者我可以这样离开它,但我想知道是否有办法只使用像.bind()或等函数来做到这一点.apply().

我想过使用.bind().apply()但这将导致function(loadDataFromFile, files, callback)这是不行的.

Ber*_*rgi 5

我想知道是否有办法只使用.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();
});
Run Code Online (Sandbox Code Playgroud)

可能你需要bind将方法带到正确的上下文中,比如fs.readdir.bind(fs, '../testdata').