Saltar al contenido

Captura el error de red asíncrona de XMLHttpRequest send ()

Posterior a consultar especialistas en esta materia, programadores de deferentes ramas y maestros hemos dado con la solución al dilema y la compartimos en esta publicación.

Solución:

Utilizar el onerror evento de la XMLHttpRequest:

function aGet(url, cb) 
    var x = new XMLHttpRequest();
    x.onload = function(e) 
        cb(x.responseText)
    ;
    x.onerror= function(e) 
        alert("Error fetching " + url);
    ;
    x.open("GET", url, true);
    x.send();


var dmp = console.log.bind(console); // Dummy callback to dump to console
aGet("/", dmp) // Ok, uses onload to trigger callback
aGet("http://dgfgdf.com/sdfsdf", dmp); // Fails, uses onerror to trigger alert

Escribí una solución completa a ese problema. ¡Funciona perfectamente!
tengo una funcion llamada networkOrfail que intentará reenviar el XMLHttpRequest cada segundo, si la red está disponible. De lo contrario, ignorará la solicitud.
Cuando la solicitud tiene éxito, el sondeo se detiene y se devuelve la respuesta.

Aquí se explica cómo detectar si la red está disponible:

function getNavigatorConection() 
    return navigator.onLine;

Luego, crea tu XMLHttpRequest:

function makeRequest() 
    let xhr = new XMLHttpRequest();
    xhr.open('GET', 'anypage/anotherpage', true);
    xhr.timeout = 2000;
    xhr.onload = function () 
        // Your request is completed
        if (xhr.readyState == 4 && xhr.status == 200) 
            // You're in a successfully condition
        
    ;
    xhr.ontimeout = function (e) 
        // Your request timed out
    ;
    xhr.send(null);

Ahora, defina su método de sondeo de la siguiente manera:

function networkOrFail(callFunc, callTime) 
    let connected = getNavigatorConection();
    let callableTimes = callTime < 2000 ? 2000 : callTime;
    let toursBegin = 3;
    let tours = toursBegin;
    let intervalId;
    let request = function() 
        intervalId = setInterval(function()  
        let connected = getNavigatorConection();
        if (tours > 0) 
            if (connected) 
                callFunc();
                tours =0;
                return false;
            
            tours--;
            alert("i tryied againt to resend for another time and it remain just "+tours+" to retry");
         else 
            clearRequest();
            tours =toursBegin;
        
    , callableTimes > 5000 ? 5000 : callableTimes);

    ;
    let clearRequest = function() 
        clearInterval(intervalId);
        intervalId = null;
    ;
    if (connected)
        callFunc();
    else
        request();

Finalmente, llame al método de envío a través del método de sondeo pasándolo junto con el tiempo de espera en minutos:

networkOrFail(makeRequest, 5000);

Reseñas y puntuaciones

Si te mola el proyecto, tienes la habilidad dejar una reseña acerca de qué te ha impresionado de este tutorial.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *