用于绑定回调序列的Composer函数

时间:2018-05-30 20:42:43

标签: javascript callback bind

StackOverflow社区。我试图创建一个组成一系列回调的函数,这样我就可以按正确的顺序运行它们。

function Number1 (callback) {
   do something...
   callback();
}

function Number2 (callback) {
   do something...
   callback();
}

function Number3 (callback) {
   do something...
   callback();
}

如果我们将其视为一个函数数组,则每个回调函数都会接收下一个函数,因为它自己的回调函数。即:函数Number1接收函数Number2作为其回调函数,而回调函数接收函数Number3作为其回调函数,依此类推。

所以,对于函数:

RunThem(callbacks) {
   ...
}

RunThem(Number1, Number2, Number3);

组合结果应该是这样的:

Number1.bind(this, Number2.bind(this, Number3))

有没有办法用currying或类似的方法来做到这一点?

提前致谢。

1 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点。您可以使用reduceRight

const func = callbacks.reduceRight(
   // not sure what you want `this` to refer to, so using `null` instead
  (func, callback) => callback.bind(null, func)
);



function noop() {}

function runThem(...callbacks) {
  callbacks.reduceRight(
    (func, callback) => callback.bind(null, func),
    noop
  )();
}

function Number1 (callback) {
   console.log(1);
   callback();
}

function Number2 (callback) {
   console.log(2);
   callback();
}

function Number3 (callback) {
   console.log(3);
   callback();
}

runThem(Number1, Number2, Number3);




您也可以完全避免使用.bind并关闭函数堆栈:



function runThem(...callbacks) {
  callbacks.shift()(function run() {
    if (callbacks.length > 0) {
      callbacks.shift()(run);
    }
  });
}

function Number1 (callback) {
   console.log(1);
   callback();
}

function Number2 (callback) {
   console.log(2);
   callback();
}

function Number3 (callback) {
   console.log(3);
   callback();
}

runThem(Number1, Number2, Number3);