Асинхронная функция повтора Javascript в блоке перехвата обещаний всегда выполняется, несмотря на Promise.resolve () - PullRequest
0 голосов
/ 24 августа 2018

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

Буду признателен за любую помощь или понимание!

1 Ответ

0 голосов
/ 24 августа 2018

Вы хотите передать функцию, которая выполняется при перехвате, но вы фактически выполняете функцию немедленно и вместо этого передаете полученное обещание:

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

должно быть:

 p = p.catch(() => doAsync(i));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...