jquery ajax同步调用beforeSend

时间:2011-02-11 15:49:49

标签: 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: function() {
       // remove loading indicator 
     }
   }
  );
}

在代码中,我多次调用“callAjax”X次,我想同步更新数据。它按预期完成,但有一个问题:loading项目没有显示在beforeSend函数中。如果我将async变为true,它可以正常工作,但更新不会同步完成。

我尝试了几件事但没有成功。我尝试在ajax调用之前加载加载指示符,如下所示:

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

  $.ajax(
    {
      // same as above
    }
   );
}

但由于某种原因,它不想显示加载指标。当我在beforeSend中输入“alert”并且在那种情况下出现加载指示符时,我注意到一种奇怪的行为,但我宁愿不弹出消息框。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

像这样进行同步通话就像放了一个“alert()”框。有些浏览器完全停止了他们正在做的事情,直到收到HTTP响应。

因此,在您的代码中,在您调用“$ .ajax()”函数开始后,没有发生,直到收到响应,并且代码的下一个内容将是“成功”处理程序。

通常,除非您对服务器确实有信心,否则使用异步调用会更好。当你这样做时,浏览器立即返回其工作,只是在后台监听HTTP响应。当响应到达时,将调用您的成功处理程序。

答案 1 :(得分:1)

当您执行阻塞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中{p> 编辑 ajaxcall,Example

答案 2 :(得分:-1)

这就是你要找的东西 - .ajaxStart()

任何ajax事件开始时都会触发

http://api.jquery.com/ajaxStart/

他们甚至给出了一个类似于你想要完成的具体例子:

 $("#loading").ajaxStart(function(){
   $(this).show();
 });

然后您可以使用.ajaxStop()函数

$("#loading").ajaxStop(function(){
      $(this).hide();
});