Ajax上的超时仅在iOS上调用,仅在一个特定的移动运营商(Rogers / Fido)

时间:2018-05-17 13:15:15

标签: javascript ios iphone ajax xmlhttprequest

我们有一个网络应用程序向后端发出ajax请求,只有在 iPhone / iPad 时才会频繁但间歇性超时,并且仅在使用一个特定移动运营商时(罗杰斯/菲多在加拿大魁北克省)。

我们在这个非常简单,纯粹的Javascript JSFiddle中完全隔离了我们的应用程序中的问题:http://jsfiddle.net/6aancdwu/

  • 在iOS上使用Rogers / Fido simcard,慢慢点击TEST按钮最终会导致5个电话中的一个卡住,并在几分钟内停止计时(有时会立即停止,有时需要花费更多时间才能完成发生)。
  • 我们在Android设备上使用相同的SIM卡进行了测试,即使在数千次通话后也没有超时。
  • 我们使用来自其他运营商的各种sim卡在相同的iOS设备上进行了测试,并且无法在数千次之后重现超时事件。
  • 我们在许多不同的物理位置和许多iOS设备上进行了测试,问题是相同的。
  • 我们在iOS 11和iOS 9上测试过同样的问题。
  • 我们确认超时呼叫不会进入服务器。
  • 我们使用jQuery.ajax()测试,直接使用XmlHttpRequests和fetch(),同样的问题。

我们不知道该怎么办,在Rogers与谁联系以及他们是否愿意花时间研究这个问题。

任何人都知道原因是什么以及为什么它只发生在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;
}

0 个答案:

没有答案