запрос на повторную попытку извлечения (при неудаче)

Я использую встроенный в браузер fetch API для сетевых запросов. Также я использую полифил whatwg-fetch для неподдерживаемых браузеров.

Однако мне нужно повторить попытку в случае сбоя запроса. Теперь есть этот пакет npm whatwg-fetch-retry, который я нашел, но они не не объяснили, как использовать его в своих документах. Может ли кто-нибудь помочь мне с этим или предложить мне альтернативу?


person dsaket    schedule 12.09.2017    source источник
comment
Отвечает ли это на ваш вопрос? Как попробовать метод JS fetch() в цикле   -  person ggorlen    schedule 31.01.2021


Ответы (2)


Из выборочных документов:

fetch('/users')
    .then(checkStatus)
    .then(parseJSON)
    .then(function(data) {
          console.log('succeeded', data)
    }).catch(function(error) {
          console.log('request failed', error)
    })

Видишь этот улов? Будет срабатывать, когда выборка не удалась, вы можете снова получить ее. Взгляните на Promise API.

Пример реализации:

function wait(delay){
    return new Promise((resolve) => setTimeout(resolve, delay));
}

function fetchRetry(url, delay, tries, fetchOptions = {}) {
    function onError(err){
        triesLeft = tries - 1;
        if(!triesLeft){
            throw err;
        }
        return wait(delay).then(() => fetchRetry(url, delay, triesLeft, fetchOptions));
    }
    return fetch(url,fetchOptions).catch(onError);
}

Редактировать 1: как предложено golopot, p-retry - хороший вариант.

Редактировать 2: упрощенный пример кода.

person Isidrok    schedule 12.09.2017
comment
Это именно то, чем я сейчас занимаюсь. Но я ищу что-то вроде дополнительных необязательных { retry: 3, // максимальное количество повторных попыток retryTimeout: 3000 // тайм-аут между последовательными запросами} - person dsaket; 12.09.2017
comment
Я только что обновил пример тем, что, по моему мнению, должно быть рабочей версией, возможно, вам потребуется некоторая настройка. Скажите, если вы хотите, чтобы некоторые комментарии в коде сделали его более понятным. - person Isidrok; 12.09.2017
comment
Спасибо за указание на то, что @BenjaminGruenbaum код был довольно грязным - person Isidrok; 15.06.2020

Я рекомендую использовать какую-нибудь библиотеку для повторной попытки обещания, например p-retry.

Пример:

const pRetry = require('p-retry')
const fetch = require('node-fetch')

async function fetchPage () {
  const response = await fetch('https://stackoverflow.com')

  // Abort retrying if the resource doesn't exist
  if (response.status === 404) {
    throw new pRetry.AbortError(response.statusText)
  }

  return response.blob()
}

;(async () => {
  console.log(await pRetry(fetchPage, {retries: 5}))
})()
person golopot    schedule 13.02.2019