2017-10-11 1 views
0

Ich habe Client-Seite Logger, die einen Client-Seite Fehler auf Server für die Protokollierung POST.Wie stoppe die Verbreitung von ajaxerror Ereignis

var logger = (function ($) { 
    var module = {}; 
    module.log = function (obj) { 
     try {   
      $.ajax({ 
       type: "POST", 
       data: JSON.stringify(obj), 
       url: '/jslog' 
      }) 
      .fail(function (jqXHR, textStatus, errorThrown) { 
       console.error('JS error report submission failed.'); 
       // how to stop progating ajaxError here? 
      }) 
     } 
     catch (ex) { 
      console.error('JS error report submission failed.'); 
      // how to stop progating ajaxError here? 
     } 
    } 
    return module; 

})(jQuery); 

dann auf der Seite habe ich zwei Event-Handler angeschlossen.

  1. beliebigen AJAX-Fehler behandeln
  2. jedes Java-Script-Fehlerprotokoll

    $(document).ajaxError(function (event, jqxhr, settings, thrownError) { 
         logger.log({ jqxhr: jqxhr }) 
        }); 
    
    window.onerror = function (msg, url, line) { 
        logger.log({ message: msg, url: url, line: line }) 
    } 
    

AUSGABE

Die logger.log intern verwendet Ajax POST zu handhaben senden der Server. Wenn also die Protokollierung selbst fehlschlägt, wird erneut $(document).ajaxError ausgelöst, wodurch erneut versucht wird, Fehler zu protokollieren, und so weiter. Es geht in einer kontinuierlichen Schleife.

Gibt es eine Möglichkeit, die Weiterleitung von ajaxError in catch oder fail Event-Handler zu stoppen?

Wenn nicht, dann, wie ohne AJAX POST?

oder gibt es eine andere bessere Möglichkeit, dies zu handhaben (ohne anyother 3rd-Party-lib zu verwenden)

Antwort

0

Die meiste Zeit, wenn ich eine Endlosschleife brechen muß ich in einem Wurf:

return;

Soweit Sie AJAX veröffentlichen, können Sie diese Art von Lösung verwenden, die einen NoCache-Helfer hat, um schreckliches IE-Ajax-Caching zu vermeiden. jQuery neigt dazu, selbst mit dem ajax-Cache umzugehen, daher ist eine noCache-Option meiner Meinung nach fast eine Notwendigkeit.

function postAjax(url, data, success) { 
    var params = typeof data == 'string' ? data : Object.keys(data).map(
     function(k){ return encodeURIComponent(k) + '=' + encodeURIComponent(data[k]) } 
    ).join('&'); 

    var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); 

    noCacheRequest('POST',url,xhr); 

    xhr.onreadystatechange = function() { 
    if (xhr.readyState>3 && xhr.status==200) { 
     success(xhr.responseText); } 
    }; 
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
    xhr.send(params); 
    return xhr; 
} 

function noCacheRequest(http_method,url,request_object) { 
    var no_cache = '?' + new Date().getTime(); 
    return request_object.open(http_method.toUpperCase(), url + no_cache, true); 
} 
-1

Überprüfen Sie die URL in ajaxError() und nicht Protokollanforderung machen, wenn Fehler aus der Logging-URL ist:

$(document).ajaxError(function (event, jqxhr, settings, thrownError) { 
    if (settings.url !== '/jslog') { 
    logger.log({ jqxhr: jqxhr }); 
    } 
});