時々 ECONNRESET
返すAPIが1つあります。 だから私はそのようなエラーで再試行したいと思います。 このライブラリにretry
機能を追加する予定はありますか?
これに関する更新はありますか?
これはとても重要だと思います。 シナリオは、モバイルWeb用にAxiosを実装し、ユーザーがインターネットソースをWiFiから任意の種類のモバイル接続に切り替える場合です。
この種の機能はこのライブラリにあるべきではないと思います。 これが必要な場合は、このためのインターセプターを作成できます。
@jtangelderそれはどのように見えるべきですか?
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);
このようなもの! 500エラーを1回再試行します。
これはコアライブラリに属していないという@jtangelderに同意します。 これは、図に示すように、インターセプターの優れたユースケースです。
@jtangelder @mzabriskieありがとう! 実際、これはドキュメントの優れた例でもあります
+1この例が見つけやすくなればいいのにと思います。
@jtangelderスニペットを
スニペットを少し修正すると、返されるエラーステータスは500ではなく504になるはずです。
@jtangelder非常に役立つ例。
指数バックオフで何かをする方法について何かアイデアはありますか? retryFailedRequest
からプロミスを返すことは可能ですか? または他の提案? ありがとう!
@jtangelderの例は、クックブックページに含める必要があります
これで、 axios-retryを使用できます。
同意します。 これは実際にはライブラリの一部であるか、少なくともより適切に文書化されている必要があります。
@mericsson再試行するときに、指数バックオフが必要です。 私は素晴らしい働きをする以下をまとめました。 これは現在すべてのエラーをインターセプトして再試行するだけなので、特定のエラー/ステータスコードのチェックを追加したいと思います。
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);
});
});
使用するには:
axios.get('/some/endpoint', { retry: 5, retryDelay: 1000 })
.then(function(res) {
console.log('success', res.data);
})
.catch(function(err) {
console.log('failed', err);
});
構成オプション:
retry
-最初にリクエストが失敗した後にリクエストを再試行する回数。
retryDelay
-失敗したリクエストの間に待機するミリ秒数(デフォルトは1)。
ある時点で、要点でこれをもう少し構成可能にするかもしれません。
@KyleRossコードをありがとう、再試行が指数関数的になるように調整しました
// 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共有していただきありがとうございます。
遅延はますます設定できます。
const RETRY_TIMEOUTS = [1, 3, 5, 10]; // seconds
const delay = RETRY_TIMEOUTS[config.retryCount] * 1000;
4xxまたは5xxリクエストを再試行する場合は、次のようなエラーオブジェクトを操作する必要があります。
リクエストを傍受するには:
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);
});
応答を傍受するには:
axios.interceptors.response.use(function (response) {
// Do something with response data
return response;
}, function (error) {
// Do something with response error
return Promise.reject(error);
});
素晴らしいアイデア。 人々が興味を持っているなら、私はこれのかなりの部分をnpmモジュールにまとめました:
https://github.com/JustinBeckwith/retry-axios
機能のリクエストを喜んで承ります✨
axios-retry
vs retry-axios
@KyleRoss再試行およびretryDelay構成オプションをAxiosRequestConfigに追加しようとしましたが、それらが存在するようには見えません。 どうやってそれを機能させたのですか?
@lawloretienne再試行パラメーターを使用する前に、私の例のコードを必ず追加する必要があります。 プラグインのように機能するため、新しいプロパティはaxios自体の一部として文書化されていません。
config.__retryCount = config.__retryCount || 0;
@KyleRoss configconfigを渡すことができません。各 'config .__ reyCount'は未定義です。
https://github.com/axios/axios/blob/v0.19.0/lib/core/mergeConfig.js
カスタムプロパティが除外されるようになりました。
@dennisreimannカスタム設定がv0.19で除外されるようになり、次のように設定を渡すことができるようになりました。
axios.defaults.headers.common['retry'] = 3
axios.defaults.headers.common['retryDelay'] = 1000
axios.defaults.headers.common['retryCount'] = 0
@mericsson再試行するときに、指数バックオフが必要です。 私は素晴らしい働きをする以下をまとめました。 これは現在すべてのエラーをインターセプトして再試行するだけなので、特定のエラー/ステータスコードのチェックを追加したいと思います。
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); }); });
使用するには:
axios.get('/some/endpoint', { retry: 5, retryDelay: 1000 }) .then(function(res) { console.log('success', res.data); }) .catch(function(err) { console.log('failed', err); });
構成オプション:
retry
-最初にリクエストが失敗した後にリクエストを再試行する回数。
retryDelay
-失敗したリクエストの間に待機するミリ秒数(デフォルトは1)。ある時点で、要点でこれをもう少し構成可能にするかもしれません。
手伝ってくれてありがとう!
最も参考になるコメント
@mericsson再試行するときに、指数バックオフが必要です。 私は素晴らしい働きをする以下をまとめました。 これは現在すべてのエラーをインターセプトして再試行するだけなので、特定のエラー/ステータスコードのチェックを追加したいと思います。
使用するには:
構成オプション:
retry
-最初にリクエストが失敗した後にリクエストを再試行する回数。retryDelay
-失敗したリクエストの間に待機するミリ秒数(デフォルトは1)。ある時点で、要点でこれをもう少し構成可能にするかもしれません。