jquery 我如何才能同步调用aExcellence而不使我的网页冻结

cbwuti44  于 2024-01-07  发布在  jQuery
关注(0)|答案(7)|浏览(167)

我有一些JavaScript,它会对一个php脚本发出大约100个调用。这个php脚本会占用大量内存,需要几秒钟才能完成,然后返回一个json响应,通过或失败。
我不想让apache调用是异步的,因为服务器在运行100个自身示例时会停下来,所以我尝试使用synchronous,唯一的问题是当它一次调用一个脚本时,它会冻结网页。
我怎样才能一次只发出一个自动调用,而不冻结我所在的页面?

  1. var a = [];
  2. a[0] = 'test';
  3. a[1] = 'hello';
  4. a[2] = 'another';
  5. $(document).ready(function(){
  6. $.each(a, function(k,v) {
  7. $.ajax({
  8. url:'/this-script-takes-a-few-seconds-to-complete.php',
  9. async:false,
  10. data: {foo: v},
  11. success: function(data){
  12. console.log(data);
  13. }
  14. });
  15. });
  16. });

字符串

vpfxa7rd

vpfxa7rd1#

你可以放入一个执行下一个调用的函数,并从你的success处理程序调用它,像这样:

  1. $(function(){
  2. var i = 0;
  3. function nextCall() {
  4. if(i == a.length) return; //last call was last item in the array
  5. $.ajax({
  6. url:'/this-script-takes-a-few-seconds-to-complete.php',
  7. data: { foo: a[i++] },
  8. success: function(data){
  9. console.log(data);
  10. nextCall();
  11. }
  12. });
  13. }
  14. nextCall();
  15. });

字符串
不过.更好的方法是不要进行100次调用,除非这是某种测试套件,否则我会重新访问整个方法。

展开查看全部
l7mqbcuq

l7mqbcuq2#

如果你不想你的调用是异步的,那么浏览器就不能更新UI,这会冻结。为什么你不能让它异步呢?而不是一次完成所有100个,只是等待一个完成,然后调用下一个。

6mw9ycah

6mw9ycah3#

你需要重构这个东西。100个异步请求是疯狂的,而且所有的请求都是同步的。
我建议你重构你的应用程序,这样你就可以解析所有的数据,然后在一个异步的过程中发送,或者几个异步的请求,而不是100个。
如果你需要100个,那么就建立一个队列,然后按顺序异步处理它们。

vaqhlq81

vaqhlq814#

那么问题是,Ajax.
尝试同步执行Ajax会违背使用Ajax的初衷。
尝试使用线程池并以双线程方式运行它。

ev7lccsx

ev7lccsx5#

编辑-正确答案

大多数浏览器都会限制对单个服务器的HTTP请求数量,大概是为了防止出现你想防止的情况(服务器过载)。我不确定现代浏览器的实际数字是多少,尽管我假设它比我在2005年在Firefox中观察到的旧的“2”要多。
一些资源:

这个脚本将每2秒调用一个同步$.ajax,每次将数据从数组a中移出。在每个请求实际执行期间,UI仍然会锁定,但允许它在调用之间更新自己。我认为,这是完全同步和完全异步之间的一个很好的折衷。
请注意,此脚本是破坏性的-a在完成时将为空。如果您需要a的内容,那么您可能需要创建一个副本。

  1. a = [
  2. 'test',
  3. 'hello',
  4. 'another'
  5. ];
  6. $(function() {
  7. var send = function() {
  8. $.ajax({
  9. url: '/this-script-takes-a-few-seconds-to-complete.php',
  10. async: false,
  11. data: {foo: a.shift()},
  12. success: function(data) {
  13. console.log(data)
  14. }
  15. });
  16. if (!a.length)
  17. {
  18. clearInterval(timer);
  19. }
  20. }
  21. var timer = setInterval(send, 2000);
  22. });

字符串

展开查看全部
iih3973s

iih3973s6#

使用'setbacks'来调用你的'aprc:false'属性。

  1. setTimeout(function () {
  2. // ajax calls here
  3. },
  4. 250
  5. );

字符串

8iwquhpp

8iwquhpp7#

我有类似的问题,我需要同步调用,IE被冻结。总之,我想出了这个方法。
1.我没有使用synchroniou call,而是使用了synchronic:true。
1.在complete:函数中递归调用下一个请求。
它让我可以同时拨打一个电话,所以我在前一个电话之后打电话。

相关问题