将回调函数数组减少到一个回调

时间:2016-07-01 15:46:02

标签: javascript function underscore.js reduce

我想知道如何创建一个函数来调用数组中的所有函数而不显式创建一个函数。我说的是简单的javascript(或者也许是一些underscore.js / lodash助手,但我没有找到任何有用的东西)。

假设我们有一个接受回调的方法:

function doSmth(cb) {
  console.log('doing smth');
  cb();
}

现在我们有三个我们想要调用的函数,但是我们不喜欢显式创建一个包装器函数。

function write1() {
  console.log(1)
}

function write2() {
  console.log(2)
}

function write3() {
  console.log(3)
}

我们可以以某种方式将[write1, write2, write3]数组减少为单个函数吗?我尝试将Function.prototype.call绑定到Array.prototype.forEach,但我没有到达任何地方。

编辑:我忘了提及我们不想修改doSmth

2 个答案:

答案 0 :(得分:1)

没有第三方库,这很简单。您可以将在doSmth函数中作为回调运行的所有函数传递给另一个函数,该函数首先返回循环遍历所有回调的函数:

function doSmth(cb) {
  console.log('doing smth');
  cb();
}

function write1() {
  console.log(1)
}

function write2() {
  console.log(2)
}

function write3() {
  console.log(3)
}

function mergeManyCallbacks() {
  var fns = Array.from(arguments);
  return function() {
    fns.forEach(fn => {
      fn()
    })
  }
}

// here is your call to doSmth
doSmth(mergeManyCallbacks(write1, write2, write3))

答案 1 :(得分:1)

您可以使用forEach辅助功能。

let invoke = (fn, ...args) => fn(...args);
arr.forEach(invoke);

// or for an array of the results
let results = arr.map(invoke);

// es5 translation of invoke
var invoke = function() {
  var fn = arguments[0];
  var args = [].slice.call(arguments, 1, arguments.length);
  return fn.apply(null, args);
};

let doIt = arr.forEach.bind(arr, invoke)
takesACallback(doIt);