promise catch块中的Javascript重试异步函数始终在promise.resolve()之外运行

promise catch块中的Javascript重试异步函数始终在promise.resolve()之外运行,javascript,promise,Javascript,Promise,我试图测试一种在javascript中重试失败的异步函数的方法 按照中的示例,我制作了一个JSFIDLE 函数doAsync(i){ console.log(“doAsync”+i); 返回承诺。解决(); } 函数ayncFunc(){ 返回doAsync(-1).catch(doAsync(0)).catch(doAsync(1)).catch(doAsync(2)); }; var重试次数=3次; 函数ayncFunc2(){ var p=doAsync(-1); 对于(变量i=0;i

我试图测试一种在javascript中重试失败的异步函数的方法

按照中的示例,我制作了一个JSFIDLE

函数doAsync(i){
console.log(“doAsync”+i);
返回承诺。解决();
}
函数ayncFunc(){
返回doAsync(-1).catch(doAsync(0)).catch(doAsync(1)).catch(doAsync(2));
};
var重试次数=3次;
函数ayncFunc2(){
var p=doAsync(-1);
对于(变量i=0;i
我遇到的问题是,尽管doAsync函数返回一个已解决的承诺,但代码仍会落入catch块,并执行重试

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

现在的输出是

doAsync-1 DOASync0 DOASync1 DOASync2

doAsync-1 DOASync0 DOASync1 DOASync2

DOASync0


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

您希望传递一个在catch上执行的函数,但实际上是立即执行该函数,并传递结果承诺:

  p = p.catch(doAsync(i));
必须是:

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

您希望传递一个在catch上执行的函数,但实际上是立即执行该函数,并传递结果承诺:

  p = p.catch(doAsync(i));
必须是:

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

你不能在承诺链中连环抓块,除非你从内扔接住你不能在承诺链中连环抓块,除非你从内扔接住谢谢!我太专注于承诺部分了,这对我来说是新的,我完全错过了这个错误。谢谢!我太专注于承诺部分了,这对我来说是新的,完全错过了这个错误。