JQuery Ajax - Ajax কল করার সময় কীভাবে নেটওয়ার্ক সংযোগ ত্রুটি সনাক্ত করা যায়


91

আমার কাছে কিছু জাভাস্ক্রিপ্ট জ্যাকুয়েরি কোড রয়েছে যা প্রতি 5 মিনিটে অ্যাজাক্স সার্ভারে কল করে, এটি সার্ভার সেশনটি বাঁচিয়ে রাখতে এবং ব্যবহারকারীকে লগইন রাখতে $.ajax()হয় J আমি JQuery এ পদ্ধতি ব্যবহার করছি । এই ফাংশনটির একটি 'ত্রুটি' সম্পত্তি রয়েছে বলে মনে হচ্ছে যে ব্যবহারকারীর ইন্টারনেট সংযোগ হ্রাস পাচ্ছে যাতে কেপএলাইভ স্ক্রিপ্টটি চলতে থাকে এমন ইভেন্টে আমি ব্যবহার করার চেষ্টা করছি। আমি নিম্নলিখিত কোড ব্যবহার করছি:

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' নয় সার্ভার থেকে স্থিতি কোডের জন্য? আজাক্স কল করার সময় নেটওয়ার্ক সংযোগ সমস্যা সনাক্ত করার কোনও উপায় আছে কি?


আপনি কি ক্লায়েন্টের নেটওয়ার্ক কেবল বা সার্ভারের নেটওয়ার্ক কেবলটি আনপ্লাগ করেছেন?
জেফ স্টার্নাল

আপনি কি আপনার সংযোগটি আনপ্লাগ করার পরে 'সাফল্য' সতর্কতা অবিরত রাখছেন?
উইলকিনস

4
@ জেফ - এটি ক্লায়েন্ট-এ ইন্টারনেট সংযোগের ক্ষতি হওয়ায় এটি সমস্যা সৃষ্টি করছে। অবিশ্বাস্যরূপে এটি আসলে ঘটছে কারণ কিছু ক্লায়েন্টরা অল্প বেতার সংযোগের সাথে অ্যাপ্লিকেশনটি ব্যবহার করে যা ছাড়তে থাকে। এখানে একটি বক্তব্য আছে "আপনার অ্যাপ্লিকেশন ভাঙ্গার উপায়গুলি খুঁজে পাওয়ার জন্য শেষ ব্যবহারকারীদের ক্ষমতাকে কখনই
হ্রাস করবেন না

@ কিওয়ার্টিপ্যান্টস - না, একবার ইন্টারনেট সংযোগ নষ্ট হয়ে গেলে কিছুই হয় না (যেমন, কেবল প্লাগিং করা)। যদিও $ .জ্যাক্স প্রচেষ্টা করা হয়েছে, তবে আমি এটি ফায়ারব্যাগে দেখতে পাচ্ছি।
রবিবার আয়রনফুট

সংযোগের চেষ্টাটির সময়সীমা নির্ধারণের জন্য কি কোনও উপায় আছে?
axk

উত্তর:


99
// 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

4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। আপনি aj .ajax এ সরবরাহ করা ত্রুটি ফাংশনে, প্রথম প্যারামিটার সমস্ত ধরণের স্থিতির তথ্য সরবরাহ করে। আপনি সময়সীমা নির্ধারণ না করলেও এটি তা করে।
মাইক স্পিয়ার

এবং এজাক্স ফর্মের সাহায্যেও <form ... data-ajax-failure="YourMethod" ...></form>এটি করতে : এবং আপনার পদ্ধতিতেfunction YourMethod(XMLHttpRequest) { ..same code... }
ম্যাথিউউ চার্বননিয়ার


13

আপনার কেবল যোগ করা উচিত: timeout: <number of miliseconds>,কোথাও এর মধ্যে $.ajax({})। এছাড়াও, cache: false,কয়েকটি পরিস্থিতিতে সাহায্য করতে পারে।

aj .জ্যাক্স ভালভাবে নথিভুক্ত করা হয়েছে , আপনার সেখানে বিকল্পগুলি পরীক্ষা করা উচিত, কিছু কার্যকর হতে পারে।

শুভকামনা!



9

যেহেতু আমি ইস্যুটির সদৃশ করতে পারি না আমি কেবলমাত্র এজ্যাক্স কলটিতে টাইমআউট দিয়ে চেষ্টা করার পরামর্শ দিতে পারি। JQuery এ আপনি এটি aj .ajaxSetup দিয়ে সেট করতে পারেন (এবং এটি আপনার সমস্ত aj .জ্যাক্স কলগুলির জন্য বৈশ্বিক হবে) বা আপনি এটিকে বিশেষত আপনার কলের জন্য সেট করতে পারেন:

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

জিকুরি আপনার কলটিতে একটি 15 সেকেন্ডের সময়সীমা নিবন্ধন করবে; এর পরে সার্ভারের কোনও পোস্টের প্রতিক্রিয়া কোড ছাড়াই jQuery টেক্সটস্ট্যাটাস মানটিকে "টাইমআউট" এ সেট করে ত্রুটি কলব্যাক কার্যকর করবে। এটির সাহায্যে আপনি কমপক্ষে এজাক্স কলটি থামাতে পারবেন তবে সংযোগ নষ্ট হওয়ার পরে আপনি আসল নেটওয়ার্ক সমস্যাগুলি পৃথক করতে পারবেন না।


3

আমি এই ক্ষেত্রে যা দেখছি তা হ'ল যদি আমি ক্লায়েন্ট মেশিনের নেটওয়ার্ক কেবলটি টান এবং কল করি, এজাক্স সাফল্যের হ্যান্ডলারটি বলা হয় (কেন, আমি জানি না), এবং ডেটা প্যারামিটারটি একটি খালি স্ট্রিং। সুতরাং আপনি যদি সত্যিকারের ত্রুটি পরিচালনা পরিচালনা করে থাকেন তবে আপনি এরকম কিছু করতে পারেন:

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

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


0

ব্যবহার করুন

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

-1

ব্যবহারকারীদের নেটওয়ার্ক ডাউন হয়ে যাওয়ার বা পৃষ্ঠায় আপডেট ব্যর্থ হওয়ার ক্ষেত্রে আমি সতর্ক করতে যা করেছি তা এখানে:

  1. আমার বর্তমান পৃষ্ঠায় একটি ডিভ ট্যাগ রয়েছে যেখানে আমি বর্তমান সময় রাখি এবং প্রতি 10 সেকেন্ডে এই ট্যাগটি আপডেট করি। এটি দেখতে এমন কিছু দেখাচ্ছে:<div id="reloadthis">22:09:10</div>

  2. জাভাস্ক্রিপ্ট ফাংশন শেষে যা ডিভ-ট্যাগে সময় আপডেট করে, আমি এটি রেখেছি (সময়টি এজেএক্সের সাথে আপডেট হওয়ার পরে):

    var new_value = document.getElementById('reloadthis').innerHTML;
    var new_length = new_value.length;
    if(new_length<1){
        alert("NETWORK ERROR!");
    }
    

এটাই! অবশ্যই আপনি যা চান তার সাথে সতর্কতা-অংশটি প্রতিস্থাপন করতে পারেন। আশাকরি এটা সাহায্য করবে.


-6

আপনি কি এই চেষ্টা করেছেন?

$(document).ajaxError(function(){ alert('error'); }

এটি সমস্ত AjaxErferences হ্যান্ডেল করা উচিত। আমি এটি এখানে খুঁজে পেয়েছি । সেখানে আপনার ফায়ারব্যাগ কনসোলে এই ত্রুটিগুলি লেখার সম্ভাবনাও খুঁজে পেয়েছেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.