web-dev-qa-db-fra.com

récupérer la demande de nouvelle tentative (en cas d'échec)

J'utilise le navigateur natif fetch API pour les requêtes réseau. J'utilise également le polyfill whatwg-fetch pour les navigateurs non pris en charge.

Cependant, je dois réessayer en cas d'échec de la demande. Maintenant, il y a ce paquet npm whatwg-fetch-retry J'ai trouvé, mais ils n'ont pas expliqué comment l'utiliser dans leurs documents. Quelqu'un peut-il m'aider avec cela ou me suggérer une alternative?

10
dsaket

À partir des documents officiels de récupération:

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

Vous voyez cette prise? Se déclenchera lorsque la récupération échoue, vous pouvez y récupérer à nouveau par exemple.

Jetez un œil aux promesses https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Modifier: ajoutez un exemple de travail qui devrait retourner un résultat. J'ai essayé en Chrome (v.60.0) et n'ai utilisé aucun polyfill ni le package que vous mentionnez (après avoir lu attentivement les documents, il semble que ce soit juste une fourchette de fetch polifyll).

function fetchRetry(url, delay, limit, fetchOptions = {}) {
    return new Promise((resolve,reject) => {
        function success(response) {
            resolve(response);
        }
        function failure(error){
            limit--;
            if(limit){
                setTimeout(fetchUrl,delay)
            }
            else {
                // this time it failed for real
                reject(error);
            }
        }
        function finalHandler(finalError){
            throw finalError;
        }
        function fetchUrl() {
            return fetch(url,fetchOptions)
                .then(success)
                .catch(failure)
                .catch(finalHandler);
        }
        fetchUrl();
    });
}

fetchRetry('https://www.google.es',1000,4)  
   .then(function(response){
       if(!response.ok){
           throw new Error('failed!');
       }
       return response;
   })
   .then(function(response){
       console.log(response);
   })
   .catch(function(error){
       console.log(error);
    });

Je n'ai pas testé si les nouvelles tentatives renvoient la réponse, mais je suppose que oui.

Edit: a trouvé ce package mais il remplace l'API fetch, donc je ne suis pas sûr de cela, https://www.npmjs.com/package/fetch-retry (il y a deux autres packages comme celui-ci dans la première page de résultats google pour fetch-retry ...)

5
Isidro Torregrosa

Je recommande d'utiliser une bibliothèque pour réessayer la promesse, par exemple p-retry .

Exemple:

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}))
})()
1
golopot