jquery-ajaxqを使用して、特定のリクエストが同時に実行されないようにしています。クライアントのネットワークがひどいことを除けば、うまく機能します。接続の失敗またはリクエストのキャンセルを示しているように見えるHTTP ステータス コード 0 のタイムアウトまたはエラーが頻繁に発生します。ステータス コードが 0 の特定の状況では、あきらめてユーザーにエラー メッセージを表示する前に、x 回再試行したいと考えています。
これを使用してこれを行う方法を示す素晴らしいスタック オーバーフローの回答があり$.ajax(this)
ますが、ajaxq を使用しているため、ここでは機能しません。
コードが現在どのように機能するかの概要は次のとおりです。
doAjax = function(incomingOpts) {
// do some option defaulting here
//...
var options = {
//...
success: function(data, textStatus, jqXHR) {
// basically, if we get here, we could still have an app
// level error so we check for that and call the appropriate
// callback
if ( blah blah ) {
incomingOpts.handleSuccess(data);
else
incomingOpts.handleError(data);
},
error: function(jqXHR, textStatus, errorThrown) {
// throw up a big error dialog to the user with
// as much data as we can include about what happened
//...
}
};
_.extend(options, incomingOpts);
return $.ajaxq(options.url.substring(0, 30), options);
};
上記のエラー関数で再試行したい条件を識別するのは、エラー メソッドで十分に簡単です。
if ( textStatus === "error" && errorThrown === "" && jqXHR.status === "0" ) {
// then we want to retry
}
私たちが問題を抱えているのは、再試行ロジックをどのように実装するかということです。また、すべての呼び出しが失敗した場合にスタック内の 1 つの呼び出しだけがエラーのログを記録し、呼び出しが 1 つだけであることを確認する必要があります。再試行の 1 つが実際に機能する場合の適切な成功関数。