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.