Axios: Wiederholungsparameter hinzufügen

Erstellt am 27. Nov. 2015  ·  23Kommentare  ·  Quelle: axios/axios

Ich habe eine API, die von Zeit zu Zeit ECONNRESET zurückgibt. Also würde ich gerne einen solchen Fehler wiederholen. Haben Sie vor, dieser Bibliothek die Funktion retry hinzuzufügen?

Hilfreichster Kommentar

@mericsson Ich brauche beim erneuten

axios.interceptors.response.use(undefined, function axiosRetryInterceptor(err) {
    var config = err.config;
    // If config does not exist or the retry option is not set, reject
    if(!config || !config.retry) return Promise.reject(err);

    // Set the variable for keeping track of the retry count
    config.__retryCount = config.__retryCount || 0;

    // Check if we've maxed out the total number of retries
    if(config.__retryCount >= config.retry) {
        // Reject with the error
        return Promise.reject(err);
    }

    // Increase the retry count
    config.__retryCount += 1;

    // Create new promise to handle exponential backoff
    var backoff = new Promise(function(resolve) {
        setTimeout(function() {
            resolve();
        }, config.retryDelay || 1);
    });

    // Return the promise in which recalls axios to retry the request
    return backoff.then(function() {
        return axios(config);
    });
});

Benutzen:

axios.get('/some/endpoint', { retry: 5, retryDelay: 1000 })
    .then(function(res) {
        console.log('success', res.data);
    })
    .catch(function(err) {
        console.log('failed', err);
    });

Konfigurationsoptionen:
retry - Anzahl der Wiederholungsversuche der Anfrage nach der ersten fehlgeschlagenen Anfrage.
retryDelay - Anzahl der Millisekunden, die zwischen fehlgeschlagenen Anforderungen gewartet werden soll (Standardwert 1).

Ich kann dies irgendwann im Wesentlichen etwas konfigurierbarer machen.

Alle 23 Kommentare

Gibt es hierzu Neuigkeiten?

Ich denke, das ist sehr wichtig. Das Szenario könnte sein, wenn wir Axios für das mobile Web implementieren, dann wechselt der Benutzer die Internetquelle von WiFi auf eine beliebige Art von mobiler Verbindung.

Ich denke nicht, dass diese Art von Funktionalität in dieser Bibliothek enthalten sein sollte. Wenn Sie dies benötigen, können Sie dafür einen Interceptor erstellen.

@jtangelder eine Idee, wie es aussehen sollte?

function retryFailedRequest (err) {
  if (err.status === 500 && err.config && !err.config.__isRetryRequest) {
    err.config.__isRetryRequest = true;
    return axios(err.config);
  }
  throw err;
}
axios.interceptors.response.use(undefined, retryFailedRequest);

Etwas wie das! Es wiederholt 500 Fehler einmal.

Ich stimme @jtangelder zu, dass dies nicht in die

@jtangelder @mzabriskie danke! eigentlich ist es auch ein tolles Beispiel für die Dokumentation

+1 Ich wünschte, dieses Beispiel wäre leichter zu finden!

@jtangelder vielen Dank für den Ausschnitt

Eine kleine Korrektur am Snippet, ich denke, der zurückgegebene Fehlerstatus sollte 504 statt 500 sein.

@jtangelder sehr hilfreiches Beispiel.

Ich frage mich, irgendwelche Ideen, wie man etwas mit exponentiellem Backoff machen kann? Ist es möglich, ein Versprechen von retryFailedRequest ? Oder andere Vorschläge? Vielen Dank!

Das Beispiel in @jtangelder sollte in die Kochbuchseite aufgenommen werden

Dafür können Sie nun

Ich stimme zu. Dies sollte wirklich ein Teil der Bibliothek sein, oder zumindest besser dokumentiert werden.

@mericsson Ich brauche beim erneuten

axios.interceptors.response.use(undefined, function axiosRetryInterceptor(err) {
    var config = err.config;
    // If config does not exist or the retry option is not set, reject
    if(!config || !config.retry) return Promise.reject(err);

    // Set the variable for keeping track of the retry count
    config.__retryCount = config.__retryCount || 0;

    // Check if we've maxed out the total number of retries
    if(config.__retryCount >= config.retry) {
        // Reject with the error
        return Promise.reject(err);
    }

    // Increase the retry count
    config.__retryCount += 1;

    // Create new promise to handle exponential backoff
    var backoff = new Promise(function(resolve) {
        setTimeout(function() {
            resolve();
        }, config.retryDelay || 1);
    });

    // Return the promise in which recalls axios to retry the request
    return backoff.then(function() {
        return axios(config);
    });
});

Benutzen:

axios.get('/some/endpoint', { retry: 5, retryDelay: 1000 })
    .then(function(res) {
        console.log('success', res.data);
    })
    .catch(function(err) {
        console.log('failed', err);
    });

Konfigurationsoptionen:
retry - Anzahl der Wiederholungsversuche der Anfrage nach der ersten fehlgeschlagenen Anfrage.
retryDelay - Anzahl der Millisekunden, die zwischen fehlgeschlagenen Anforderungen gewartet werden soll (Standardwert 1).

Ich kann dies irgendwann im Wesentlichen etwas konfigurierbarer machen.

@KyleRoss Danke für den Code, ich habe eine Anpassung vorgenommen, damit die Wiederholungen exponentiell sind

// Create new promise to handle exponential backoff. formula (2^c - 1 / 2) * 1000(for mS to seconds)
    const backOffDelay = config.retryDelay 
        ? ( (1/2) * (Math.pow(2, config.__retryCount) - 1) ) * 1000
        : 1;

    const backoff = new Promise((resolve) => {
        setTimeout(() => {
            resolve();
        },  backOffDelay);
    });

@KyleRoss Danke fürs Teilen.

Die Verzögerung kann zunehmend eingestellt werden:

const RETRY_TIMEOUTS = [1, 3, 5, 10]; // seconds
const delay = RETRY_TIMEOUTS[config.retryCount] * 1000;

Wenn Sie eine 4xx- oder 5xx-Anfrage wiederholen möchten, müssen Sie mit dem Fehlerobjekt wie folgt arbeiten:

Um Ihre Anfragen abzufangen:

axios.interceptors.request.use(function (config) {
    // Do something before request is sent
    return config;
  }, function (error) {
    // Do something with request error
    return Promise.reject(error);
  });

Um Ihre Antworten abzufangen:

axios.interceptors.response.use(function (response) {
    // Do something with response data
    return response;
  }, function (error) {
    // Do something with response error
    return Promise.reject(error);
  });

Tolle Ideen. Ich habe ein ganzes Stück davon in ein npm-Modul gepackt, wenn die Leute interessiert sind:
https://github.com/JustinBeckwith/retry-axios

Gerne nehmen wir Funktionsanfragen entgegen ✨

axios-retry vs retry-axios

@KyleRoss Ich habe versucht, AxiosRequestConfig die Konfigurationsoptionen retry und retryDelay hinzuzufügen, aber es sieht nicht so aus, als ob sie existieren. Wie hast du das zum Laufen gebracht?

@lawloretienne Sie müssen sicherstellen, dass Sie den Code in meinem Beispiel hinzufügen,

config.__retryCount = config.__retryCount || 0;

@KyleRoss Die Konfigurationskonfiguration kann nicht übergeben werden, jeder 'config.__reyCount' ist undefiniert.
https://github.com/axios/axios/blob/v0.19.0/lib/core/mergeConfig.js
Benutzerdefinierte Eigenschaften werden jetzt herausgefiltert.

Die benutzerdefinierte Konfiguration von

axios.defaults.headers.common['retry'] = 3
axios.defaults.headers.common['retryDelay'] = 1000
axios.defaults.headers.common['retryCount'] = 0

@mericsson Ich brauche beim erneuten

axios.interceptors.response.use(undefined, function axiosRetryInterceptor(err) {
    var config = err.config;
    // If config does not exist or the retry option is not set, reject
    if(!config || !config.retry) return Promise.reject(err);

    // Set the variable for keeping track of the retry count
    config.__retryCount = config.__retryCount || 0;

    // Check if we've maxed out the total number of retries
    if(config.__retryCount >= config.retry) {
        // Reject with the error
        return Promise.reject(err);
    }

    // Increase the retry count
    config.__retryCount += 1;

    // Create new promise to handle exponential backoff
    var backoff = new Promise(function(resolve) {
        setTimeout(function() {
            resolve();
        }, config.retryDelay || 1);
    });

    // Return the promise in which recalls axios to retry the request
    return backoff.then(function() {
        return axios(config);
    });
});

Benutzen:

axios.get('/some/endpoint', { retry: 5, retryDelay: 1000 })
    .then(function(res) {
        console.log('success', res.data);
    })
    .catch(function(err) {
        console.log('failed', err);
    });

Konfigurationsoptionen:
retry - Anzahl der Wiederholungsversuche der Anfrage nach der ersten fehlgeschlagenen Anfrage.
retryDelay - Anzahl der Millisekunden, die zwischen fehlgeschlagenen Anforderungen gewartet werden soll (Standardwert 1).

Ich kann dies irgendwann im Wesentlichen etwas konfigurierbarer machen.

danke für die Hilfe!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen