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或类似的方法来做到这一点?
提前致谢。
答案 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);