У нас есть веб-приложение, отправляющее ajax-запросы к бэкэнду, и мы получаем частые, но периодические таймауты только при использовании iPhone / iPad и только при использовании одного конкретного оператора мобильной связи (Роджерс). Фидо в Квебеке, Канада).
Мы полностью изолировали проблему от нашего приложения в этом очень простом, чистом Javascript JSFiddle: http://jsfiddle.net/6aancdwu/
- В iOS и на симкарте Rogers / Fido, медленное нажатие кнопки TEST приведет к зависанию одного из 5 вызовов и истечению времени ожидания в течение нескольких минут (иногда сразу, иногда для этого требуется немного больше времени) бывает).
- Мы протестировали с одной и той же симкартой на устройстве Android и без таймаута даже после тысяч звонков.
- Мы протестировали на том же устройстве iOS с широким спектром сим-карт от других операторов и не можем воспроизвести событие тайм-ауты после тысяч.
- Мы тестировали во многих физических местах и на многих устройствах iOS, и проблема та же.
- Мы тестировали на iOS 11 и iOS 9, та же проблема.
- Мы подтвердили, что тайм-аут вызовов не поступает на сервер.
- Мы протестировали с jQuery.ajax (), прямым XmlHttpRequests и с fetch (), та же проблема.
Мы больше не знаем, что попробовать, с кем связаться в Роджерсе и захотят ли они потратить время на расследование этого.
Кто-нибудь имеет представление, что может быть причиной и почему это происходит только на iOS + Rogers?
Есть ли что-нибудь еще, что мы могли бы попробовать?
Если кто-нибудь использует iPhone и Rogers / Fido, можете ли вы воспроизвести проблему с помощью JSFiddle?
Мы бы предпочли не реализовывать решение с автоматической отменой и повторной попыткой, потому что некоторые из наших вызовов иногда могут быть немного продолжительными, и в итоге мы отменили бы хорошие вызовы.
<a href="#" onclick="return go();">TEST</a>
<br><br>
<div id="output">waiting for action</div>
var count = 0;
function go() {
count = 0;
document.getElementById("output").innerHTML = "0/5";
var q1 = sendAjax();
var q2 = sendAjax();
var q3 = sendAjax();
var q4 = sendAjax();
var q5 = sendAjax();
return false;
}
function sendAjax() {
var xhr = new XMLHttpRequest();
var timer = setTimeout(function() { alert("TIMEOUT"); xhr.abort(); }, 30000);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
clearTimeout(timer);
count++;
document.getElementById("output").innerHTML = count + "/5";
if (xhr.status === 200) {
} else {
alert("ERROR, " + "status: " + xhr.status + ", statusText: " + xhr.statusText);
}
}
};
xhr.open("GET", "/echo/js/?_=" + new Date().getTime() + "&js=hello");
xhr.send();
return xhr;
}