我试图按顺序执行函数(sync / async)的以下数组(避免callbackHell),实现函数runCallbacksInSequence
(我需要实现自己的函数以了解回调的工作原理并避免使用Async.js)。
我不太了解回调的工作原理,这就是为什么我要进行此练习。这是我到目前为止所拥有的。函数runCallbacksInSequence
运作良好,但是我很难实现callback (null, result)
签名。目前,它遵循callback (result)
签名。
如果您有任何想法,请告诉我我做错了什么以及如何解决。
-没有承诺和异步/等待
function first(cb) {
setTimeout(function() {
console.log('first()');
cb('one');
// cb(null, 'one');
}, 0);
}
function second(cb) {
setTimeout(function() {
console.log('second()');
cb('two');
// cb(null, 'two');
}, 100);
}
function third(cb) {
setTimeout(function() {
console.log('third()');
cb('three');
// cb(null, 'three');
}, 0);
}
function last(cb) {
console.log('last()');
cb('lastCall');
// cb(null, 'lastCall');
}
function runCallbacksInSequence(fns, cb) {
fns.reduce((r, f) => k => r(acc => f(x => k([...acc, x]))), k => k([]))(cb);
}
const fns = [first, second, third, last];
runCallbacksInSequence(fns, results => {
console.log('-- DONE --');
console.log(...results);
});
答案 0 :(得分:2)
在您的runCallbacksInSequence
中,您首先必须将x
移至第二个位置,为了保持一致性,最终回调应以第一个参数为null
来调用:>
function runCallbacksInSequence(fns, cb) {
// v v vvvvvvvv
fns.reduce((r, f) => k => r(acc => f((e, x) => k([...acc, x]))), k => k([]))(r => cb(null, r));
}
如果您希望第一个有错误的回调(具有第一个参数设置)直接终止链,则可以将链延长一点:
// vvvvvv
fns.reduce((r, f) => k => r(acc => f((e, x) => e ? cb(e) : k([...acc, x]))), k => k([]))(r => cb(null, r));
答案 1 :(得分:1)
要回答我不太了解回调的工作方式
回调是要在另一个函数完成执行之后执行的函数。例如。
function run(cb){
console.log("run")
cb("okay it is running");
}
一个简单的函数,用于记录内容。您如何运行它?
run()
但是您想接收回调。要知道在cb()
以上,一切都已完成。你这样做。
run((arg) => {
console.log(arg) //logs "okay it is running"
});
在运行它时,实际上得到的是运行的函数的“调用”,“返回”。