【问题标题】:Using array.reduce to sequentially fire async functions without Promises使用 array.reduce 在没有 Promise 的情况下顺序触发异步函数
【发布时间】:2018-07-19 15:48:26
【问题描述】:

我可以像这样一个接一个地执行异步函数:

function asyncFn(e, cb) {
  return new Promise((res, rej) => {
    setTimeout(() => {
      console.log(e);
      res();
    }, 1000);
  });
}

var arr = [1,2,3,4,5];
arr.reduce(
  (chain, e) => chain.then(()=>asyncFn(e)),
  Promise.resolve()
);

是否可以使用回调而不是解决承诺来做同样的事情?

【问题讨论】:

  • 不,不是。它是 async/promise 部分,它允许立即从 asyncFn 返回并继续执行。如果您取出此代码的 Promise/Async 部分,则它需要等待对 asyncFn 的每次调用完成,然后才能继续执行。如果那不能为您解释,请告诉我,我会尝试更好地解释它。 ** 你可以用 setTimeout 来做,但维护起来会很麻烦。
  • setTimeout 是异步函数的一个例子,如果这就是你所说的
  • 解决 promise 的缺点是什么?
  • 真的没有缺点,只是想看看可能更难的答案
  • reduce 并不是真正适合这项工作的工具。与没有承诺的事情相比,这将是一个相当糟糕的比较。

标签: javascript node.js asynchronous es6-promise


【解决方案1】:

当然,但它有点复杂:

const logLater = (msg, time, cb) => setTimeout(() => (console.log(msg), cb()), time);

const arr = [1, 2, 3, 4, 5];

arr.reduceRight((next, el) => () => logLater(el, 1000, next), () => console.log("all done!"))();

或者在多行中:/:

function logLater(msg, time, cb) {
 setTimeout(function() {
   console.log(msg);
   cb();
 }, time);
}

const arr = [1, 2, 3, 4, 5];

arr.reduceRight(function(next, el) {
 return function current() {
   logLater(el, 1000, next);
 };
}, function() { })();

建立回调链是向后的,因此记录5 将被包装在一个函数中,该函数在调用时记录它,然后该函数被传递到4 的包装器中,该包装器将在4 被调用时调用它记录后,4 的包装器将作为 next 传递给 3 的包装器,依此类推。


但是,如果您只想对数组的所有元素执行特定任务并等待上一个回调,则可以使用调用自身的函数来完成:

function logLater(msg, time, cb) {
 setTimeout(function() {
   console.log(msg);
   cb();
 }, time);
}

const arr = [1, 2, 3, 4, 5];

(function  next(i) {
   logLater(arr[i], 1000, function done() {
     if(i < arr.length - 1) next(i + 1);
   });
})(0);

【讨论】:

  • 这一定是我见过的最难理解的代码。我不喜欢这种趋势,即一切都必须是一条线并且不可能轻易遵循。为了看起来时尚和“花哨”,这过于复杂,并且可能让 OP 比刚开始时更加困惑。
  • @adam 然后使用更易于理解的代码添加您自己的答案 :)
  • 或者你可以停止尝试时髦和酷,而只是帮助那个人。
  • 什么都听不懂...没有身份,一切都在一行中
  • @mateusz 那是不可能的,因为你不能回调一个还不存在的函数。
猜你喜欢
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 2018-09-20
  • 1970-01-01
相关资源
最近更新 更多