并行执行多个AJAX请求,无需等待其他人响应

时间:2015-02-24 09:02:31

标签: jquery ajax multithreading

我遇到了需要执行多个AJAX请求的问题 在一页上。请求同时启动,但它们似乎等待其前任返回。

让我们说page1需要大约3秒才能加载。并且page2需要2秒才能加载。我得到的是两个都在同一时间开始,并且page1请求在3个secons之后返回。

但问题是page2请求在5秒后返回。 为什么会这样 ?我以为每个AJAX请求都会在它自己的线程中运行。那为什么排队呢?为什么第二个等待第一个响应它甚至似乎开始?

如何设置发送请求并处理每个请求,并在收到后立即响应?

$.ajax({
    type: "POST",
    url: 'page1.php',
    data: { }
})
.done(function( data ) {                
    console.log(data);
});
$.ajax({
    type: "POST",
    url: 'page2.php',
    data: { }
})
.done(function( data ) {                
    console.log(data);
});

我看到很多使用这种方法的例子。

$.when(
    $.get("/resource1"),
    $.get("/resource2"),
    $.get("/resource3")
).done(function(response1, response2, response3) {
// do things with response1, response2 and response3;
});

但据我所知,只要所有人都回复,就会处理回复。

关于这个的任何想法?

3 个答案:

答案 0 :(得分:4)

首先编写样本保证,以便在任何AJAX请求完成且CPU 免费使用时运行代码。 忘记JS引擎单线程,并且当CPU空闲时,排队任务要执行。

如果您的第一个完成的AJAX请求(A1)需要10秒才能运行,并且在此期间第二个AJAX请求(A2)完成,A2必须等待,因为CPU正在处理A1的代码。

您可以在此https://www.youtube.com/watch?v=8aGhZQkoFbQ中找到更多详细信息。在此视频中,Philip Roberts描述了事件循环如何在浏览器中运行。

答案 1 :(得分:2)

给异步:true 该请求将被不经意地处理!

$.ajax({
            url: 'test.html',
            async: true,
            success: function (data) { alert(data); }
        });

答案 2 :(得分:1)

如果您使用的是PHP和基于文件的会话,则每个(PHP)页面可能只限于一个请求。您必须关闭会话才能同时处理多个请求。有关此问题的解决方案,请参阅https://stackoverflow.com/a/8065977/1620112