Попытка повторения неудачной асинхронной / обещающей функции? - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть этот асинхронный блок:

test().then(function(result){
    // Success: Do something.
    doSomething();
}).catch(function(error){
    // Error: Handle the error, retry!
    // How to re-run this whole block?
});

Я могу отслеживать результаты success и failed.Однако можно ли повторить всю цепочку test().then().catch(), если мы потерпим неудачу?И продолжайте повторять, пока условие не разрешится?

Ответы [ 4 ]

0 голосов
/ 31 декабря 2018

Если предположить, что все дело в повторной отправке запроса на какой-то ошибочный / раздутый сторонний API

Если это производственный вопрос, скорее образовательный, я бы предложил поискать стороннюю библиотеку, которая реализует это самостоятельно.

Скажи за axios там приятно axios-retry.

Почему?Предположим, вы думаете, что есть только один случай, когда API, скажем, возвращает 502. Но на самом деле есть гораздо больше случаев, которые лучше иметь в виду:

  1. различные конкретные причины ошибок, скажем, когдаОшибка поиска в сети или DNS. Возможно, нет необходимости повторять запрос
  2. ограничение количества повторов
  3. увеличение задержки
  4. что-то еще

Запись такогологика сама по себе будет настоящим излишним.И попытка использовать простейшее решение может поразить вас, когда вы этого не ожидаете.

PS также в качестве бонуса вы сможете настроить все запросы к какому-то конкретному API с помощью одного фрагмента, как это делается для axios'пользовательские экземпляры (и я считаю, что для альтернативных библиотек должны быть другие плагины)

0 голосов
/ 31 декабря 2018

Вы можете поместить его в функцию.

function dbug() {

test().then(function(result){
    // Success: Do something.
    doSomething();
}).catch(function(error){
    // Error: Handle the error, retry!
    dbug()
});
}
0 голосов
/ 31 декабря 2018

Если вы можете переключиться на синтаксис async/await, вы можете использовать цикл while:

let keepTrying;

do {
    try {
        await test();
        keepTrying = false;
    } catch {
        keepTrying = true;
    }
} while (keepTrying)

doSomething();

Затем вы можете абстрагировать логику повторных попыток в свою собственную функцию для повторного использования.

0 голосов
/ 31 декабря 2018

Вы можете поместить все это в функцию, которая рекурсивно вызывает себя, если введен блок catch:

function tryTest() {
  return test().then(function(result) {
    // Success: Do something.
    doSomething();
  }).catch(function(error) {
    // error handling

    // make sure to return here,
    // so that the initial call of tryTest can know when the whole operation was successful
    return tryTest();
  });
}


tryTest()
  .then(() => {
    console.log('Finished successfully');
  });

Если ваш doSomething может принимать аргумент result, и если tryTest не принимает никаких аргументов, вы можете упростить вышесказанное до:

function tryTest() {
  return test()
    .then(doSomething)
    .catch(tryTest);
}


tryTest()
  .then(() => {
    console.log('Finished successfully');
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...