同时执行多个 AJAX 请求而无需等待其他请求的响应

3
我有一个问题,需要在一个页面上执行多个AJAX请求。这些请求同时开始,但似乎都在等待它们的前任返回。
比方说,页面1需要大约3秒钟来加载,而页面2需要2秒钟才能加载。我得到的结果是它们同时开始,而页面1的请求在3秒后返回。
但问题是,页面2的请求在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;
});

但据我所知,它会在所有响应返回后立即处理这些响应。对此有什么想法吗?

你需要添加一个额外的属性 async:true。如果你设置了 async: true,那么该语句将开始执行,并且下一条语句将被调用,无论异步语句是否已经完成。 - Manoz
3
“async:true”是默认设置,无需明确设置。@Manoz - Jai
是的,这是真的。异步默认为true,我已经尝试过了。 - ZSchneidi
似乎你没有任何答案。 - Malus Jan
3个回答

6

您的第一段代码样例保证了当任何AJAX请求完成并且CPU空闲时运行代码。不要忘记JS引擎是单线程的,并且会在CPU空闲时对任务进行排队。

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

您可以在https://www.youtube.com/watch?v=8aGhZQkoFbQ中了解更多细节。在这个视频中,Philip Roberts描述了事件循环在浏览器中的工作原理。


好的,这很有趣。我能理解这个例子,但是如果A1需要10秒钟,假设A2需要2秒钟,并且两者同时发送,为什么A2要在12秒后返回而不是在A1返回后立即返回呢? - ZSchneidi
2
жҲ‘еңЁиҝҷйҮҢеҲӣе»әдәҶдёҖдёӘз®ҖеҚ•зҡ„зӨәдҫӢгҖӮA1йңҖиҰҒ10з§’й’ҹеҠ иҪҪпјҢиҖҢA2еҸӘйңҖиҰҒ2з§’й’ҹгҖӮдјјд№ҺA2е…Ҳе®ҢжҲҗдәҶпјҢ然еҗҺжҳҜ8з§’й’ҹеҗҺзҡ„A1гҖӮ - Nima Shahri
我现在对此有更好的理解了。那个问题的最佳解决方案可能是什么?我该如何同时加载耗时的部分? - ZSchneidi
好的,你的示例运行得非常符合我的预期。A2在2秒后返回,而A1在10秒后返回。但是,如果我尝试使用自己请求的资源来运行此代码,A1将在10秒后返回,而A2将在12秒后返回。这种行为是什么原因引起的?我不明白... - ZSchneidi
我目前的想法是我们的Web服务器可能会排队处理我的请求。所以也许这就是实际的问题所在。 - ZSchneidi

2

如果您正在使用PHP和基于文件的会话,您可能会受到每个(PHP)页面一次请求的限制。您必须关闭会话才能同时处理多个请求。有关解决此问题的方法,请参见https://dev59.com/UkbRa4cB1Zd3GeqP5f7K#8065977


2

设为async:true,请求将会独立处理!

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

1
如上面的评论所述,async 默认为 true。 - ZSchneidi
响应时间取决于请求和响应的大小。异步仅在您想同时调用请求还是逐个调用请求时才起作用? - Ila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接