实施顺序回调执行

时间:2019-06-07 08:02:57

标签: javascript

我试图按顺序执行函数(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);
});

2 个答案:

答案 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"
});

在运行它时,实际上得到的是运行的函数的“调用”,“返回”。