ajax呼び出しのグローバルエラー処理メソッドが必要です。これが現在の方法です。
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
displayError();
}
});
のエラーを無視する必要がありますaborted
。errorThrown
nullであり、textStatus
ですerror
。どうすれば確認できaborted
ますか?
ajax呼び出しのグローバルエラー処理メソッドが必要です。これが現在の方法です。
$.ajaxSetup({
error: function (XMLHttpRequest, textStatus, errorThrown) {
displayError();
}
});
のエラーを無視する必要がありますaborted
。errorThrown
nullであり、textStatus
ですerror
。どうすれば確認できaborted
ますか?
abort
手動で呼び出している場合(そして、他にいつ呼び出されるかはわかりません)、エラーメッセージを渡すことができます:abort("abort")
。
回答:
今日も同じユースケースに対処する必要がありました。私が取り組んでいるアプリには、これらの長時間実行されるajax呼び出しがあり、1)ユーザーがナビゲートするか、2)ある種の一時的な接続/サーバー障害によって中断される可能性があります。エラーハンドラーは、接続/サーバーの障害に対してのみ実行し、ユーザーが移動する場合には実行しないようにします。
最初にAlastairPittsの回答を試しましたが、リクエストの中止と接続障害の両方でステータスコードとreadyStateが0に設定されたため、機能しませんでした。次に、siepplの回答を試しました。また、どちらの場合も応答がなく、ヘッダーがないため、機能しませんでした。
私のために働いた唯一の解決策は、window.onbeforeunloadのリスナーを設定することです。これは、ページがアンロードされたことを示すグローバル変数を設定します。エラーハンドラは、ページがアンロードされていない場合にのみエラーハンドラをチェックして呼び出すことができます。
var globalVars = {unloaded:false};
$(window).bind('beforeunload', function(){
globalVars.unloaded = true;
});
...
$.ajax({
error: function(jqXHR,status,error){
if (globalVars.unloaded)
return;
}
});
beforeunload
ハンドラーはユーザー定義です。true
同じメソッドでアンロードをキャンセルする場合、なぜglobalVars.unloadedをに設定するのですか?
beforeunload
ユーザーが別のページに移動したとき、または呼び出しが遅すぎたときに呼び出されませんか?
最新のjQueryでは、次のrequest.statusText
値に等しいかどうかを確認できます'abort'
。
error: function (request, textStatus, errorThrown) {
if (request.statusText =='abort') {
return;
}
}
私が見つけたのは、中止されたリクエストがある場合、status
および/またはreadyState
等しいということ0
です。
私のグローバルエラーハンドラーでは、メソッドの上部にチェックがあります。
$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError) {
//If either of these are true, then it's not a true error and we don't care
if (jqXHR.status === 0 || jqXHR.readyState === 0) {
return;
}
//Do Stuff Here
});
これは私にとって完璧に機能することがわかりました。これがあなた、またはこれに遭遇した他の誰かに役立つことを願っています:)
エラー関数に渡されたtextStatus引数を確認する必要があります。http://api.jquery.com/jQuery.ajax/によると、「success」、「notmodified」、「error」、「timeout」、「abort」、または「parsererror」の値を取ることができます。「abort」は明らかにあなたがチェックしたいものです。
ここでの長いメモ:jquery-gotcha-error-callback-triggered-on-xhr-abort
bluecollarcodersの回答は、javascriptによって中止されたajaxリクエストでは機能しないため、これが私の解決策です。
var unloaded = false;
...
$(window).bind('beforeunload', function(){
unloaded = true;
});
$(document).ajaxError(function(event, request, settings) {
if (unloaded || request.statusText == "abort") {
return;
}
...
}
例えば
handler = jQuery.get("foo")
handler.abort()
ajaxErrorハンドラーによって無視されるようになります
Alastair Pittsの回答に基づいて、これを実行して、より有益なメッセージを表示することもできます。
$(document).ajaxError(function (e, jqXHR, ajaxSettings, thrownError)
{
{
if (jqXHR.status === 0)
{
alert('Not connect.\n Verify Network.');
} else if (jqXHR.status == 404)
{
alert('Requested page not found. [404]');
} else if (jqXHR.status == 500)
{
alert('Internal Server Error [500].');
} else if (exception === 'parsererror')
{
alert('Requested JSON parse failed.');
} else if (exception === 'timeout')
{
alert('Time out error.');
} else if (exception === 'abort')
{
alert('Ajax request aborted.');
} else
{
alert('Uncaught Error.\n' + jqXHR.responseText);
}
}
});
$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {
if (!jqXHR.getAllResponseHeaders()) {
return;
}
});
ajaxリクエストを手動で中止する場合は、次のように実行できます。
var xhr;
function queryData () {
if (xhr) {
// tag it's been aborted
xhr.hasAborted = true;
// manually canceled request
xhr.abort();
}
xhr = $.ajax({
url: '...',
error: function () {
if (!xhr.hasAborted) {
console.log('Internal Server Error!');
}
},
complete: function () {
xhr = null;
}
});
}