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/