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

cbwuti44  于 4个月前  发布在  jQuery
关注(0)|答案(7)|浏览(61)

我有一些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);  
  }
});
  });
});

字符串

vpfxa7rd

vpfxa7rd1#

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

$(function(){ 
  var i = 0;
  function nextCall() {
    if(i == a.length) return; //last call was last item in the array
    $.ajax({
      url:'/this-script-takes-a-few-seconds-to-complete.php',
      data: { foo: a[i++] },
      success: function(data){      
        console.log(data);  
        nextCall();
      }
    });
  }
  nextCall();
});

字符串
不过.更好的方法是不要进行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的内容,那么您可能需要创建一个副本。

a = [
    'test',
    'hello',
    'another'
];

$(function() {
    var send = function() {
        $.ajax({
            url: '/this-script-takes-a-few-seconds-to-complete.php',
            async: false,
            data: {foo: a.shift()},
            success: function(data) {
                console.log(data)
            }
        });

        if (!a.length)
        {
            clearInterval(timer);
        }
    }

    var timer = setInterval(send, 2000);
});

字符串

iih3973s

iih3973s6#

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

setTimeout(function () {
        // ajax calls here
    },
    250
);

字符串

8iwquhpp

8iwquhpp7#

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

相关问题