У меня логика такая: не выводить же сразу сообщение об ошибке пользователю (вообще бесят все эти сообщения), нужно просто ещё пару раз попытаться послать запрос, а если не сработает, то уже ничего не поделаешь. timeout использовать не хочу, т.к. а вдруг у пользователя медленное соединение? И что в итоге? Я сам оборву запрос через N секунд, когда всё на самом деле было ладненько.
var request = new XMLHttpRequest();
console.log("пробуем отправить запрос 1 раз");
request.open("GET", "index.php", true);
var i = 2;
request.onreadystatechange = function() {
if (request.readyState == 4 ) { // Если запрос завершен.
if (request.status == 200) { // Если код ответа ОК.
// Бинго!
}
else if (i != 4) {
setTimeout(function() {
console.log("пробуем отправить запрос " + i + " раз через 1 сек");
request.open("GET", "index.php", true);
request.send();
i++;
}, 1000);
}
else {
console.log("Ошибка!");
}
}
}
request.send();
https://jsfiddle.net/pau84w4p/5/