我遇到了Javascript / JQuery的异步特性问题。
让我们说以下(没有延迟计算,为了不让它如此麻烦);
我在页面上有三个按钮(A,B,C),每个按钮都会将一个项目添加到购物车中,每个按钮都有一个ajax请求。 如果我在服务器端脚本(PHP)中故意延迟5秒并按下1秒钟的按钮,我希望结果如下:
Request A, 5 seconds
Request B, 6 seconds
Request C, 7 seconds
然而,结果是这样的
Request A, 5 seconds
Request B, 10 seconds
Request C, 15 seconds
这必须意味着请求排队而不是同时运行,对吧?这与异步是否相反?我还尝试在url中添加一个随机的get参数,以强制请求一些唯一性,但没有运气。
我确实读了一下这个。如果您避免使用相同的“请求对象(?)”,则不会出现此问题。是否可以在JQuery中强制执行此行为?
这是我正在使用的代码
$.ajax(
{
url : strAjaxUrl + '?random=' + Math.floor(Math.random()*9999999999),
data : 'ajax=add-to-cart&product=' + product,
type : 'GET',
success : function(responseData)
{
// update ui
},
error : function(responseData)
{
// show error
}
});
我也尝试了GET和POST,没有区别。
我希望在单击按钮时立即发送请求,而不是在上一个请求完成时发送。我希望请求同时运行,而不是在队列中运行。
答案 0 :(得分:8)
好的,我会尝试,我认为你需要一个更好的方式来记录时间。我不知道你现在在做什么来测试时间,但这是一个好方法。
如果您还没有使用Firebug for Firefox。
打开Firebug并转到网络标签。确保启用它。
当你点击每个按钮时,你会看到每个请求都进来。如果你点击每个按钮,你看不到下一个请求开始,直到上一个请求结束,然后这告诉我javascript中有问题。但是,我猜你应该把每个酒吧的开头分开1秒。这样做,让我们知道你看到了什么。
修改强>
我想我发现你有问题。我猜你在php中使用睡眠功能。睡眠功能为当前会话休眠。如果你打开3个标签,并放入ajax网址,你会发现同样的行为。 5,10,然后15s为每个标签完成。我尝试谷歌搜索,并发现与其他人相同的结果。这可能是因为PHP并不是真正的多线程。我建议使用不同的框架。
答案 1 :(得分:3)
通过使用session_write_close(),显然可以轻松地通过此行为;用PHP。但是,这可以轻松地为DDos攻击打开。我在10秒钟内按下F5刷新了一页,并且在任何时候杀死了我的计算机。
案件结案。
答案 2 :(得分:0)
根据我的理解,只有当你不在不同的js范围内时,才能进行并行ajax调用。似乎在不同的js范围内使您以序列化方式使用相同的“请求对象”。
所以我们可以在Stack溢出上找到两个关于这个链接的优秀响应,看到第二个响应带有并行查询堆栈对象,这是你需要的东西,在这个并行堆栈上添加你的请求它们真的会得到并行触发(堆栈溢出是网络中最好的站点:-))。 Parallel asynchronous Ajax requests using jQuery
答案 3 :(得分:0)
并发Ajax请求的数量有限制。见这个
How many concurrent AJAX (XmlHttpRequest) requests are allowed in popular browsers?
看起来它依赖于浏览器。
鲍勃
答案 4 :(得分:0)
您无法同时执行此操作,因为一个浏览器UI线程导致JS具有伪异步操作。但是你可以尝试Web Workers,这是执行代码超出浏览器UI线程的方法。他们已经支持Firefox 3.5,Chrome 3和Safari 4。 也许它会提高您的应用程序可用性