Axios: Menambahkan Parameter Coba Lagi

Dibuat pada 27 Nov 2015  ·  23Komentar  ·  Sumber: axios/axios

Saya memiliki satu API yang dari waktu ke waktu mengembalikan ECONNRESET . Jadi saya ingin mencoba lagi pada kesalahan seperti itu. Apakah Anda memiliki rencana untuk menambahkan fitur retry ke perpustakaan ini?

Komentar yang paling membantu

@mericsson Saya juga membutuhkan backoff eksponensial saat mencoba lagi. Saya telah mengumpulkan yang berikut ini yang berfungsi dengan baik. Anda ingin menambahkan dalam memeriksa kesalahan/kode status tertentu karena ini saat ini hanya memotong dan mencoba kembali semua kesalahan.

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);
    });
});

Menggunakan:

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

Opsi Konfigurasi:
retry - Berapa kali untuk mencoba kembali permintaan setelah permintaan pertama gagal.
retryDelay - Jumlah milidetik untuk menunggu di antara permintaan yang gagal (default ke 1).

Saya mungkin membuat ini sedikit lebih dapat dikonfigurasi dalam Intisari di beberapa titik.

Semua 23 komentar

ada update tentang ini?

Saya pikir ini sangat penting. Skenarionya mungkin ketika kami menerapkan Axios untuk web seluler, maka pengguna mengalihkan sumber internet dari WiFi ke koneksi seluler apa pun.

Saya tidak berpikir fungsi semacam ini seharusnya ada di perpustakaan ini. Jika Anda membutuhkan ini, Anda dapat membuat pencegat untuk ini.

@jtangelder ada ide bagaimana tampilannya?

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);

Sesuatu seperti ini! Ini mencoba 500 kesalahan sekali.

Saya setuju dengan @jtangelder bahwa ini bukan milik perpustakaan inti. Ini adalah kasus penggunaan yang bagus untuk pencegat seperti yang diilustrasikan.

@jtangelder @mzabriskie terima kasih! sebenarnya itu adalah contoh yang bagus untuk dokumentasi juga

+1 Saya berharap contoh ini lebih mudah ditemukan!

@jtangelder terima kasih banyak untuk cuplikannya

Sedikit koreksi pada cuplikan, saya pikir status kesalahan yang dikembalikan seharusnya 504, bukan 500.

@jtangelder contoh yang sangat membantu.

Saya bertanya-tanya, adakah ide tentang bagaimana melakukan sesuatu dengan backoff eksponensial? Apakah mungkin mengembalikan janji dari retryFailedRequest ? Atau saran lain? Terima kasih!

Contoh di @jtangelder harus disertakan di halaman buku masak

Anda sekarang dapat menggunakan axios-retry untuk ini.

Saya setuju. Ini harus benar-benar menjadi bagian dari perpustakaan, atau setidaknya didokumentasikan dengan lebih baik.

@mericsson Saya juga membutuhkan backoff eksponensial saat mencoba lagi. Saya telah mengumpulkan yang berikut ini yang berfungsi dengan baik. Anda ingin menambahkan dalam memeriksa kesalahan/kode status tertentu karena ini saat ini hanya memotong dan mencoba kembali semua kesalahan.

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);
    });
});

Menggunakan:

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

Opsi Konfigurasi:
retry - Berapa kali untuk mencoba kembali permintaan setelah permintaan pertama gagal.
retryDelay - Jumlah milidetik untuk menunggu di antara permintaan yang gagal (default ke 1).

Saya mungkin membuat ini sedikit lebih dapat dikonfigurasi dalam Intisari di beberapa titik.

@KyleRoss Terima kasih atas kodenya, saya membuat penyesuaian agar percobaan ulang menjadi eksponensial

// 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 Terima kasih telah berbagi.

Penundaan dapat diatur semakin:

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

Jika Anda ingin mencoba kembali permintaan 4xx atau 5xx, Anda perlu bekerja dengan objek kesalahan seperti itu:

Untuk mencegat permintaan Anda:

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);
  });

Untuk mencegat tanggapan Anda:

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

Ide-ide yang mengagumkan. Saya menggulung sedikit ini menjadi modul npm, jika orang tertarik:
https://github.com/JustinBeckwith/retry-axios

Senang menerima permintaan fitur

axios-retry vs retry-axios

@KyleRoss Saya mencoba menambahkan opsi konfigurasi coba lagi dan retryDelay ke AxiosRequestConfig tetapi sepertinya tidak ada. Bagaimana Anda membuatnya bekerja?

@lawloretienne Anda perlu Anda memastikan Anda menambahkan kode dalam contoh saya sebelum menggunakan salah satu parameter coba lagi. Karena bertindak lebih seperti plugin, properti baru tidak didokumentasikan sebagai bagian dari aksio itu sendiri.

config.__retryCount = config.__retryCount || 0;

@KyleRoss Tidak dapat melewati konfigurasi konfigurasi, setiap 'config.__reyCount' tidak ditentukan.
https://github.com/axios/axios/blob/v0.19.0/lib/core/mergeConfig.js
Properti kustom sekarang difilter.

@dennisreimann custom config sekarang difilter di v0.19, dan sekarang kita bisa melewati config seperti ini:

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

@mericsson Saya juga membutuhkan backoff eksponensial saat mencoba lagi. Saya telah mengumpulkan yang berikut ini yang berfungsi dengan baik. Anda ingin menambahkan dalam memeriksa kesalahan/kode status tertentu karena ini saat ini hanya memotong dan mencoba kembali semua kesalahan.

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);
    });
});

Menggunakan:

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

Opsi Konfigurasi:
retry - Berapa kali untuk mencoba kembali permintaan setelah permintaan pertama gagal.
retryDelay - Jumlah milidetik untuk menunggu di antara permintaan yang gagal (default ke 1).

Saya mungkin membuat ini sedikit lebih dapat dikonfigurasi dalam Intisari di beberapa titik.

terimakasih atas bantuannya!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat