Я пытаюсь протестировать метод для повторения неудачных асинхронных функций в 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 возвращает разрешенное обещание, код попадает в блок 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
Буду признателен за любую помощь или понимание!