it-swarm-ja.tech

JQuery Ajax-Ajax呼び出しを行うときにネットワーク接続エラーを検出する方法

5分ごとにサーバーにAjax呼び出しを行うJavascript JQueryコードがあります。サーバーセッションを維持し、ユーザーのログインを維持するためです。JQueryで$.ajax()メソッドを使用しています。この関数には、ユーザーのインターネット接続が切断されてKeepAliveスクリプトが実行され続ける場合に使用しようとしている「エラー」プロパティがあるようです。私は次のコードを使用しています:

var keepAliveTimeout = 1000 * 10;

function keepSessionAlive()
{
    $.ajax(
    {
        type: 'GET',
        url: 'http://www.mywebapp.com/keepAlive',
        success: function(data)
        {
            alert('Success');

            setTimeout(function()
            {
                keepSessionAlive();
            }, keepAliveTimeout);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown)
        {
            alert('Failure');

            setTimeout(function()
            {
                keepSessionAlive();
            }, keepAliveTimeout);
        }
    });
}

実行すると、10秒ごとにアラートボックスの画面に「成功」​​ポップアップが表示されますが、これは問題ありません。しかし、ネットワークケーブルを抜くとすぐに何も得られず、エラー関数が呼び出されて「失敗」アラートボックスが表示されると期待していましたが、何も起こりません。

「エラー」機能は、サーバーから返された「200」以外のステータスコード専用であると仮定して正しいですか? Ajax呼び出しを行うときにネットワーク接続の問題を検出する方法はありますか?

80
Sunday Ironfoot
// start snippet
error: function(XMLHttpRequest, textStatus, errorThrown) {
        if (XMLHttpRequest.readyState == 4) {
            // HTTP error (can be checked by XMLHttpRequest.status and XMLHttpRequest.statusText)
        }
        else if (XMLHttpRequest.readyState == 0) {
            // Network error (i.e. connection refused, access denied due to CORS, etc.)
        }
        else {
            // something weird is happening
        }
    }
//end snippet
88
Craneum

次を追加するだけです:_timeout: <number of miliseconds>,_ $.ajax({})内のどこかに。また、_cache: false,_はいくつかのシナリオで役立つ場合があります。

$。ajaxは十分に文書化されています .

幸運を!

13
Krule

この問題を再現することはできないので、ajax呼び出しのタイムアウトを試してみることをお勧めします。 jQueryでは、$。ajaxSetupで設定できます(また、すべての$ .ajax呼び出しに対してグローバルになります)。または、次のように呼び出し専用に設定できます。

$.ajax({
    type: 'GET',
    url: 'http://www.mywebapp.com/keepAlive',
    timeout: 15000,
    success: function(data) {},
    error: function(XMLHttpRequest, textStatus, errorThrown) {}
})

JQueryは、呼び出しで15秒のタイムアウトを登録します。その後、サーバーからのhttp応答コードなしで、jQueryはtextStatus値を「timeout」に設定してエラーコールバックを実行します。これにより、少なくともajax呼び出しを停止できますが、実際のネットワークの問題と接続の喪失を区別することはできません。

9
Marco Z

この場合、クライアントマシンのネットワークケーブルを引いて呼び出しを行うと、ajax成功ハンドラーが呼び出され(理由はわかりません)、データパラメーターは空の文字列になります。したがって、実際のエラー処理を除外する場合、次のようなことができます。

function handleError(jqXHR, textStatus, errorThrown) {
    ...
}

jQuery.ajax({
    ...
    success: function(data, textStatus, jqXHR) {
        if (data == "") handleError(jqXHR, "clientNetworkError", "");
    },
    error: handleError
});
3
Geoff

クロスドメインを作成する場合は、Use Jsonpを呼び出します。それ以外の場合、エラーは返されません。

1
Swapnil Rebello

つかいます

xhr.onerror = function(e){
    if (XMLHttpRequest.readyState == 4) {
        // HTTP error (can be checked by XMLHttpRequest.status and XMLHttpRequest.statusText)
        selFoto.erroUploadFoto('Erro HTTP: '+XMLHttpRequest.statusText);
    }
    else if (XMLHttpRequest.readyState == 0) {
        // Network error (i.e. connection refused, access denied due to CORS, etc.)
        selFoto.erroUploadFoto('Erro de rede:'+XMLHttpRequest.statusText);
    }
    else {
        selFoto.erroUploadFoto('Erro desconhecido.');
    }

};

(以下のコード-イメージのアップロードの例)

var selFoto = {
   foto: null,

   upload: function(){
        LoadMod.show();

        var arquivo = document.frmServico.fileupload.files[0];
        var formData = new FormData();

        if (arquivo.type.match('image.*')) {
            formData.append('upload', arquivo, arquivo.name);

            var xhr = new XMLHttpRequest();
            xhr.open('POST', 'FotoViewServlet?acao=uploadFoto', true);
            xhr.responseType = 'blob';

            xhr.onload = function(e){
                if (this.status == 200) {
                    selFoto.foto = this.response;
                    var url = window.URL || window.webkitURL;
                    document.frmServico.fotoid.src = url.createObjectURL(this.response);
                    $('#foto-id').show();
                    $('#div_upload_foto').hide();           
                    $('#div_master_upload_foto').css('background-color','transparent');
                    $('#div_master_upload_foto').css('border','0');

                    Dados.foto = document.frmServico.fotoid;
                    LoadMod.hide();
                }
                else{
                    erroUploadFoto(XMLHttpRequest.statusText);
                }

                if (XMLHttpRequest.readyState == 4) {
                     selFoto.erroUploadFoto('Erro HTTP: '+XMLHttpRequest.statusText);
                }
                else if (XMLHttpRequest.readyState == 0) {
                     selFoto.erroUploadFoto('Erro de rede:'+XMLHttpRequest.statusText);                             
                }

            };

            xhr.onerror = function(e){
            if (XMLHttpRequest.readyState == 4) {
                // HTTP error (can be checked by XMLHttpRequest.status and XMLHttpRequest.statusText)
                selFoto.erroUploadFoto('Erro HTTP: '+XMLHttpRequest.statusText);
            }
            else if (XMLHttpRequest.readyState == 0) {
                 // Network error (i.e. connection refused, access denied due to CORS, etc.)
                 selFoto.erroUploadFoto('Erro de rede:'+XMLHttpRequest.statusText);
            }
            else {
                selFoto.erroUploadFoto('Erro desconhecido.');
            }
        };

        xhr.send(formData);
     }
     else{
        selFoto.erroUploadFoto('');                         
        MyCity.mensagens.Push('Selecione uma imagem.');
        MyCity.showMensagensAlerta();
     }
  }, 

  erroUploadFoto : function(mensagem) {
        selFoto.foto = null;
        $('#file-upload').val('');
        LoadMod.hide();
        MyCity.mensagens.Push('Erro ao atualizar a foto. '+mensagem);
        MyCity.showMensagensAlerta();
 }
 };
0
MalucOJonnes