javascript - 用于绑定(bind)回调序列的 Composer 函数

标签 javascript callback bind

StackOverflow 社区。我正在尝试创建一个函数来组成一系列回调,以便我可以按正确的顺序运行它们。

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

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

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

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

因此,对于该函数:

RunThem(callbacks) {
   ...
}

RunThem(Number1, Number2, Number3);

组合的结果应该是这样的:

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

有没有办法通过柯里化(Currying)或类似的方法来做到这一点?

提前致谢。

最佳答案

有很多方法可以做到这一点。您可以使用 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);

关于javascript - 用于绑定(bind)回调序列的 Composer 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50613066/

相关文章:

javascript - 使用 "eval"创建匿名方法 - 浏览器特定行为

javascript - 如何在回调中访问正确的“this”?

jquery - 无法使分页适用于滚动网站

javascript - jQuery bind() unbind() 和 on() 和 off()

javascript - 如何使用点符号映射到值?

javascript - React - 仅特定键的状态更新值

javascript - 如何使用回调操作来自多个异步 ajax 异步调用的数据?

javascript - 如何使这些表格单元格可排序?

python - 在 Python 中使用回调时出错

javascript - 检测隐藏选择选项中的更改事件,该选项本身通过 javascript 更改