我正在使用XMLHttpRequest发出异步GET请求。我有

xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {//Handle only if the state has completed
        if (xhr.status === 200) {
            successHandler.call(context, xhr.responseText);
        } else {
            console.warn('onreadystatechange:' + new Date().getTime());
            failureHandler.call(context, xhr.status, xhr.statusText);
        }
    }
};
xhr.ontimeout = function () {
    console.warn('ontimeout: ' + new Date().getTime());
    failureHandler.call(context, 0, 'timeout');
};

我正在使用网络限制来强制超时。我观察到在超时的情况下都会调用onreadystatechangeontimeout回调,onreadystatechangeontimeout之前。我的印象是,只会执行这两者之一。我正在使用Chrome。有人知道这是否可以预期吗?

最佳答案

现代的解决方案是使用适当的XMLHttpRequest事件:如果要分别处理这些情况,则使用onload和onerror,如果希望不管成功与否都检测HTTP请求完成,则使用onloadend,并使用ontimeout超时。发生超时时,将调用ontimeout,但不会调用onloadend。 onreadystatechange看起来最好让它安静地死掉。完整的事件集可以在这里找到:

http://www.w3.org/TR/XMLHttpRequest/#events

由于onreadystatechange→ontimeout序列似乎不影响IE 8,因此我很高兴执行以下操作:在IE 8中使用onreadystatechange,并在Firefox /现代MSIE中使用onloadend(使用以下测试来查看事件是否定义为:if(httpObj中的“onloadend”)...)。

这是一个内部系统,所以对我来说足够了。对于OP,可能需要更多测试。

关于javascript - XMLHttpRequest超时情况-onreadystatechange在ontimeout之前执行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23940460/

10-12 12:39