我有一些JavaScript,它会对一个php脚本发出大约100个调用。这个php脚本会占用大量内存,需要几秒钟才能完成,然后返回一个json响应,通过或失败。
我不想让apache调用是异步的,因为服务器在运行100个自身示例时会停下来,所以我尝试使用synchronous,唯一的问题是当它一次调用一个脚本时,它会冻结网页。
我怎样才能一次只发出一个自动调用,而不冻结我所在的页面?
var a = [];
a[0] = 'test';
a[1] = 'hello';
a[2] = 'another';
$(document).ready(function(){
$.each(a, function(k,v) {
$.ajax({
url:'/this-script-takes-a-few-seconds-to-complete.php',
async:false,
data: {foo: v},
success: function(data){
console.log(data);
}
});
});
});
字符串
7条答案
按热度按时间vpfxa7rd1#
你可以放入一个执行下一个调用的函数,并从你的
success
处理程序调用它,像这样:字符串
不过.更好的方法是不要进行100次调用,除非这是某种测试套件,否则我会重新访问整个方法。
l7mqbcuq2#
如果你不想你的调用是异步的,那么浏览器就不能更新UI,这会冻结。为什么你不能让它异步呢?而不是一次完成所有100个,只是等待一个完成,然后调用下一个。
6mw9ycah3#
你需要重构这个东西。100个异步请求是疯狂的,而且所有的请求都是同步的。
我建议你重构你的应用程序,这样你就可以解析所有的数据,然后在一个异步的过程中发送,或者几个异步的请求,而不是100个。
如果你需要100个,那么就建立一个队列,然后按顺序异步处理它们。
vaqhlq814#
那么问题是,Ajax.
尝试同步执行Ajax会违背使用Ajax的初衷。
尝试使用线程池并以双线程方式运行它。
ev7lccsx5#
编辑-正确答案
大多数浏览器都会限制对单个服务器的HTTP请求数量,大概是为了防止出现你想防止的情况(服务器过载)。我不确定现代浏览器的实际数字是多少,尽管我假设它比我在2005年在Firefox中观察到的旧的“2”要多。
一些资源:
about:config
,然后查找max-connections-per-server
旧答案
这个脚本将每2秒调用一个同步
$.ajax
,每次将数据从数组a
中移出。在每个请求实际执行期间,UI仍然会锁定,但允许它在调用之间更新自己。我认为,这是完全同步和完全异步之间的一个很好的折衷。请注意,此脚本是破坏性的-
a
在完成时将为空。如果您需要a
的内容,那么您可能需要创建一个副本。字符串
iih3973s6#
使用'setbacks'来调用你的'aprc:false'属性。
字符串
8iwquhpp7#
我有类似的问题,我需要同步调用,IE被冻结。总之,我想出了这个方法。
1.我没有使用synchroniou call,而是使用了synchronic:true。
1.在complete:函数中递归调用下一个请求。
它让我可以同时拨打一个电话,所以我在前一个电话之后打电话。