如何防止被调用函数内的第二次回调

时间:2019-06-11 20:30:24

标签: javascript

我试图按顺序执行函数(sync / async)的以下数组(避免callbackHell),实现函数runCallbacksInSequence(我需要实现自己的函数以了解回调的工作原理并避免使用Async.js)。

这是我到目前为止所拥有的。函数runCallbacksInSequence运作良好,直到第二次获得相同的回调cb(null, 'one');为止。理想情况下,如果它多次获得相同的回调,则不应第二次执行并忽略它。

如果您有任何想法,请告诉我如何实施。 -没有承诺和异步/等待

function first(cb) {
  setTimeout(function() {
    console.log('first()');
    cb(null, 'one');
    cb(null, 'one');//not supposed to be execute by runCallbacksInSequence
  }, 0);
}

function last(cb) {
  console.log('last()');
  cb(null, 'lastCall');
}

function runCallbacksInSequence(fns, cb) {
  fns.reduce(
    (r, f) => {
      return k => {
        return r(() => {
          return f((e, x) => {
            return e ? cb(e) : k(x);
          });
        });
      };
    },
    k => {
      return k();
    }
  )(r => {
    return cb(null, r);
  });
}

fns = [first, last];

runCallbacksInSequence(fns, function(err, results) {
  if (err) return console.log('error: ' + err.message);
  console.log(results);
});

0 个答案:

没有答案