2

我的问题如下:

  • 在一个页面上,我正在执行多个 (6) ajax 调用(通过 jQuery)同时获取一些数据(使用 php 包装器通过调用获取数据)
  • 请求是同时发出的,需要 10-20 秒才能完成
  • 如果用户点击任何链接去其他地方(到其他页面),我可以看到所有未完成的调用都被取消了
  • 但是,浏览器仍然等待 20 秒才能导航到另一个页面 - 就像它仍在等待最长的调用完成,即使它被取消了

(同样的问题发生在 Chrome 和 Firefox 中,ajax 调用是异步的......我试图设置 ajax 超时,以在 ajax 错误响应中捕获 readystate=o,甚至试图对 webworkers 做一些事情,但无济于事)

任何见解都会有所帮助

谢谢!

4

1 回答 1

2

那是由于maximum number of connections浏览器对单个域的影响。

请参阅Browserscope以了解每个浏览器的最低限度。

  • IE 8+9:6 个连接
  • IE 10:8 个连接
  • Chrome 26:6 个连接
  • Firefox 21:6 个连接

您可以做的是收集所有延迟对象并在用户单击链接时取消它们。

例子:

// some ajax calls
doAjax({});
doAjax({});

var requests = [];

// helper function to perform and register calls
function doAjax(options) {
    var jqXHR= $.ajax(options);
    requests.push(jqXHR);
    jqXHR.always(function(jqXHR) {
         var index = requests.indexOf(jqXHR);
         if (index!=-1) {
             requests.splice(index, 1);
         }
    });
}

// function to abort all calls
// when your application has a router to provide navigation, this function
// is typically called when you navigate to another page
function abortAllPendingRequests() {
    var i;
    for (i=0; i<requests.length; i++) {
        var xhr = requests[i];
        // already finished calls (readyState 4) should not be aborted
        if (xhr.readyState != 4) {
            xhr.abort();
        }
    }
};

abortAllPendingRequests当用户尝试导航到另一个页面时,剩下的就是调用该函数。

当你有某种router(例如Backbone.Router)时,你可以在那里调用它。

如果您的应用程序没有router用于导航,但您使用普通锚链接,则可以在调用该abortAllPendingRequests函数的链接中添加 onClick。

于 2013-12-04T19:07:32.457 回答