Тайм-ауты на звонках Ajax только на iOS и только на одного конкретного оператора мобильной связи (Rogers / Fido) - PullRequest
0 голосов
/ 17 мая 2018

У нас есть веб-приложение, отправляющее 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;
}
...