Ajax jQuery同时进行多个调用-等待应答的时间很长,无法取消

Ajax jQuery multiple calls at the same time - long wait for answer and not able to cancel

本文关键字:时间 应答 取消 等待 jQuery 调用 Ajax      更新时间:2024-03-02

我的问题如下:

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

(Chrome和Firefox也出现了同样的问题,ajax调用是异步的……我曾尝试设置ajax超时,以在ajax错误响应中捕获readystate=o,甚至尝试对webworker做一些事情,但都无济于事)

任何见解都有助于

谢谢!

这是由于浏览器的maximum number of connections到单个域。

请参阅浏览器范围以了解每个浏览器的最大值。

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

你可以做的是收集所有Defferred对象,并在用户点击链接时取消它们。

示例:

// 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。