Javascript jquery ajax发送前同步调用

Javascript jquery ajax发送前同步调用,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有一个函数叫做: function callAjax(url, data) { $.ajax( { url: url, // same domain data: data, cache: false, async: false, // use sync results beforeSend: function() { // show loading indicator }, success: funct

我有一个函数叫做:

function callAjax(url, data) {
 $.ajax(
   {
     url: url, // same domain
     data: data,
     cache: false,
     async: false, // use sync results
     beforeSend: function() {
       // show loading indicator
     },
     success: function() {
       // remove loading indicator 
     }
   }
  );
}
在代码中,我多次调用“callAjax”,希望同步更新数据。这是按预期完成的,但有一个问题:加载项没有显示在beforeSend函数中。如果我将async设置为true,它会工作,但更新不会同步完成

我试过好几件事都没有成功。我尝试将加载指示器放在ajax调用之前,如下所示:

function callAjax(url, data) {
  // show loading div

  $.ajax(
    {
      // same as above
    }
   );
}
但由于某些原因,它不想显示加载指示器。我注意到一个奇怪的行为,当我在beforeSend中放置一个“警报”时,加载指示器出现在这种情况下,但我宁愿不弹出一个消息框


有什么想法吗?

像那样进行同步调用就像放一个“alert()”框。一些浏览器会完全停止正在执行的操作,直到收到HTTP响应

因此,在代码中,在对“$.ajax()”函数的调用开始后,在收到响应之前不会发生任何事情,接下来的代码就是“成功”处理程序


通常,除非您对服务器非常有信心,否则最好使用异步调用。当您这样做时,浏览器会立即返回工作状态,并在后台侦听HTTP响应。当响应到达时,您的成功处理程序将被调用。

当您执行阻塞I/O时,程序将暂停,直到收到输入;用JS的话来说,当执行同步调用时,程序将停止,浏览器窗口将冻结(无法进行绘制),直到收到响应。在大多数情况下,可以避免执行syncronus调用和任何类型的阻塞I/O。然而,想象一下你用java或任何其他编程语言做一个进度条,我认为你必须产生一个不同的线程来控制进度条

在您的案例中,要尝试的一件事是在一段时间延迟后调用ajax调用

//loading div stuff, 
//if your doing some animation here make sure to have Sufficient 
//time for it. If its just a regular show then use a time delay of 100-200
setTimeout( ajaxCall, 500 );

在setTimeout中编辑ajaxcall,

这就是您要查找的-.ajaxStart()

它将在任何ajax事件启动时触发

他们甚至给出了一个与您试图实现的目标类似的具体示例:

 $("#loading").ajaxStart(function(){
   $(this).show();
 });
然后可以使用.ajaxStop()函数


如果是同步进行的,那么浏览器会在更新页面之前等待响应。即使我将加载指示器放在ajax调用之前,它也会停止吗?我不确定我是否遵循了它的执行路径。我假设在ajax调用之前对页面进行的任何更新都将完成;你在用什么浏览器进行测试?另外,如果你在进行同步调用,那么使用“beforeSend”也没有多大意义。我在Chrome、FF和IE上都试过。在FF上,它可以正常工作。在IE和Chrome上,它将其锁定而不显示任何内容。我尝试将加载指示器放在ajax调用之前(不在beforeSend中,但完全在ajax调用之外),但它仍然没有显示出来。我假设在ajax之前进行的任何调用都会出现在浏览器上?事实并非如此。当ajax调用为async==true时,这将起作用,但在我们的例子中,浏览器本身暂停线程,因此所有内容都被阻止(包括UI更新)——浏览器只是冻结。
$("#loading").ajaxStop(function(){
      $(this).hide();
});