尽管 Promise.resolve() ,Promise catch block 中的 Javascript 重试异步函数始终运行

标签 javascript promise

我正在尝试测试一种在 JavaScript 中重试失败的异步函数的方法。

按照 https://stackoverflow.com/a/31630063/3094668 中的示例,我做了一个JSFiddle http://jsfiddle.net/tdb3sa8k/19/

function doAsync(i) {
  console.log("doAsync " + i);
  return Promise.resolve();
}

function ayncFunc() {
  return doAsync(-1).catch(doAsync(0)).catch(doAsync(1)).catch(doAsync(2));
};

var retries = 3;

function ayncFunc2() {
  var p = doAsync(-1);

  for (var i=0; i < retries; i++) {
    p = p.catch(doAsync(i));
  }
  return p;
};

function ayncFunc3() {
  function recurse(i) {
    return doAsync(i).catch(function(e) {
      if (i < retries) {
        return recurse(++i);
      }
      throw e;
    });
  }
  return recurse(0);
};


 ayncFunc().catch(function(e) { console.log(e); })
.then(ayncFunc2).catch(function(e) { console.log(e); })
.then(ayncFunc3).catch(function(e) { console.log(e); });

我遇到的问题是,尽管 doAsync 函数返回已解决的 promise ,但代码落在 catch block 中并执行重试。

请注意,代码中有3种重试机制的方法。 (ayncFunc、ayncFunc2 和 ayncFunc3)。 ayncFunc3 似乎有效,但前两者给出了意想不到的结果。 (doAsync 应该只运行一次)。

现在的输出是

doAsync -1 异步 0 异步1 doAsync 2

doAsync -1 异步 0 异步1 doAsync 2

doAsync 0

任何帮助或见解将不胜感激!

最佳答案

您想要传递一个在 catch 上执行的函数,但实际上您立即执行该函数并传递结果 promise :

  p = p.catch(doAsync(i));

必须是:

 p = p.catch(() => doAsync(i));

关于尽管 Promise.resolve() ,Promise catch block 中的 Javascript 重试异步函数始终运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52004593/

相关文章:

javascript - 我对 new Promise((resolve, reject) => {[loop]}) 阻塞而 Promise.resolve().then([loop]) 不是阻塞感到困惑

javascript - 使用 jquery 动态标记添加 DOM 元素

javascript - 通过id属性的一部分查找所有元素

javascript - 无法解决 JavaScript 中的 Promise

javascript - 如何以字符串形式返回 promise 的结果?

javascript - Node.JS - promise 异步/等待示例

javascript - 使用 Jquery 和 nunjucks 将数据绑定(bind)到 html

javascript - jquery点击背景pos Y + count++

javascript - 在 Javascript 中交换字符串的单词

javascript - 在 promise 中使函数超时的最佳一般做法是什么