尽管Promise.resolve()

时间:2018-08-24 12:32:39

标签: 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块中,并执行了重试。

请不要在代码中重试机制有3种方法。 (ayncFunc,ayncFunc2和ayncFunc3)。 ayncFunc3似乎起作用,但是前两个给出了意外的结果。 (doAsync应该只运行一次)。

现在的输出是

doAsync -1 doAsync 0 doAsync 1 doAsync 2

doAsync -1 doAsync 0 doAsync 1 doAsync 2

doAsync 0

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

1 个答案:

答案 0 :(得分:2)

您想传递一个在catch上执行的函数,但实际上是立即执行该函数,而是传递所产生的promise:

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

必须是:

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