中止を無視するJqueryAjaxエラー処理


81

ajax呼び出しのグローバルエラー処理メソッドが必要です。これが現在の方法です。

$.ajaxSetup({
  error: function (XMLHttpRequest, textStatus, errorThrown) {
    displayError();
  }
});

のエラーを無視する必要がありますabortederrorThrownnullであり、textStatusですerror。どうすれば確認できabortedますか?


4
私にとって、textStatusは「abort」です。これは古い質問だと思います-多分それは変わったのでしょう。
jackocnr 2013

私にとって、それはまだ「エラー」です。
ジャニスElmeris

はい、残念ながらブラウザによって異なります。
Christophe Roussy 2018


1
abort手動で呼び出している場合(そして、他にいつ呼び出されるかはわかりません)、エラーメッセージを渡すことができます:abort("abort")
myiEye 2018

回答:


52

今日も同じユースケースに対処する必要がありました。私が取り組んでいるアプリには、これらの長時間実行される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;
    }
});

4
これは、ajaxリクエストがJavaScriptによって中断された場合は機能しません
Sano J

1
これは有効な答えではありません。アンロード前にアンロードをキャンセルすることができます。その場合、後続のAjaxエラーはすべて無視されます。
失わ

@LOSTbeforeunloadハンドラーはユーザー定義です。true同じメソッドでアンロードをキャンセルする場合、なぜglobalVars.unloadedをに設定するのですか?
bluecollarcoder 2015

@bluecollarcoder私が言っているのは、この問題に直面している大きなプロジェクトがある場合、アンロードする前にすべてのハンドルを修正する必要があるということです。提供した新しいハンドルを追加するだけでは不十分です。
失わ

beforeunloadユーザーが別のページに移動したとき、または呼び出しが遅すぎたときに呼び出されませんか?
Christophe Roussy 2018

43

最新のjQueryでは、次のrequest.statusText値に等しいかどうかを確認できます'abort'

error: function (request, textStatus, errorThrown) {
    if (request.statusText =='abort') {
        return;
    }
}

4
クロームでは、「中止」を確認できます。Firefoxでは、「エラー」が発生します。@bluecollarcoderのソリューションは私たちにとって最良のようです。
foxont​​herock 2017年

はい、これはブラウザによって異なります(通常のWebの問題...)
Christophe Roussy 2018

21

私が見つけたのは、中止されたリクエストがある場合、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
});

これは私にとって完璧に機能することがわかりました。これがあなた、またはこれに遭遇した他の誰かに役立つことを願っています:)


3
そもそもajaxがサーバーに接続できなかった場合、同じステータスとreadyStateを取得します。しかし、これは私が処理したいエラーです。中止されただけではありません。
mitar 2012

はい、これはあなたが見たい他のエラーをマスクします。
Christophe Roussy 2018

10

エラー関数に渡されたtextStatus引数を確認する必要があります。http://api.jquery.com/jQuery.ajax/によると、「success」、「notmodified」、「error」、「timeout」、「abort」、または「parsererror」の値を取ることができます。「abort」は明らかにあなたがチェックしたいものです。

ここでの長いメモ:jquery-gotcha-error-callback-triggered-on-xhr-abort


私たちはこれをいじってみましたが、私たちが持っていた種類の中止エラーメッセージを検出することはできませんでした。
sieppl 2013年

5

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ハンドラーによって無視されるようになります


3

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

2
$(document).ajaxError(function(event, jqXHR, ajaxSettings, thrownError) {

    if (!jqXHR.getAllResponseHeaders()) {
        return;
    }           
}); 

1
どちらも助けにはなりません。中止された要求とサーバーへの接続エラーの両方について、応答ヘッダーは空です。
クロービスシックス

@ClovisSixはい、上記のソリューションは、応答ヘッダーが空であるかどうかをチェックし、苛立たしいエラーメッセージを抑制します。私たちが実行している複数の商用システムで正常に動作します。あなたが達成しようとしていること/あなたの問題は何ですか?
sieppl 2013

リクエストのいずれかがサーバーに接続できない場合は、メッセージを表示しています。手動による中止では表示されませんが、最大の問題は、ユーザーが次のページに移動したときに接続エラーが発生し、中止されたリクエストと接続エラーを区別する方法がなかったことです。window.onbeforeunloadに変数を設定することで問題を解決しました。これはほとんど手動による中止を検出します。
クロービスシックス


0

ここでも同じ問題が発生しました。解決策として行ったのは、以下のように、abort()を呼び出す直前に「aborting」変数を設定することでした。

aborting = true;
myAjax.abort();

中止が真でない場合にのみ、ajaxリクエストのエラーハンドラーにエラーを表示します。

$.ajax({
    [..]
    error: function() {
        if ( !aborting ) {
            // do some stuff..
        }
        aborting = false;
    }
});

0

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;
        }
    });
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.