简单的ajax调用似乎是阻塞的

时间:2011-03-25 20:48:51

标签: javascript jquery ajax xmlhttprequest

非常简单的问题。我试图测试我正在开发的Restful webservice,并进行这个简单的ajax调用(使用jquery):

 <script type="text/javascript">  
   $(document).ready(function() { 
     var url = '/index.php/gettest/reallyLongRequest';    
     $.ajax({
       url: url,
       dataType:'text',
       success:function(data) { $('#result').html(data);},
       error:function(xhr,err,e) { alert ("Error: " + err);}
     });                
  });
 </script>

当页面加载时运行。当它正在运行时,页面正在阻塞;即,(我可以看到鼠标指针旁边的沙漏)没有其他用户操作可以处理。 (顺便说一句,这个特殊的获取请求 - 故意 - 需要很长时间才能返回)。

这是为什么?一个(异步)JAX对吗?显然我犯了一个初学者的错误。有什么想法吗?

当我使用普通的javascript(没有库)尝试这个时,它按预期工作。这是否与Jquery处理xhr onreadystatechange有关?

感谢您的关注。

编辑:多人建议设置async:true,它实际上是jquery中的默认值,因此没有效果。

编辑:如前所述,如果我使用普通的javascript并使用计时器启动,例如window.setInterval(function() { startLongPoll(); }, 5000) 它按预期更新,而不会阻止。想法,任何人?

4 个答案:

答案 0 :(得分:4)

以下是我为解决问题所做的一个例子:

jQuery(document).ready(function() {
  setTimeout(function () {
   $.getJSON("veryLongRequest", function(json) {
   alert("JSON Result: " + json[0].id);});
  }, 500); // You may need to adjust this to a longer delay.
});

注意:我使用的是简写的jquery方法,“getJSON”,它是ajax调用的包装器,数据类型设置为“json”。但是,此解决方案适用于所有ajax请求。

引用:

Stop the browser "throbber of doom" while loading comet/server push iframe

答案 1 :(得分:0)

我认为这应该默认为true,但尝试将async: true添加到您的ajax json参数中。

答案 2 :(得分:0)

以下代码是否按预期工作?

 <script type="text/javascript">  
   //$(document).ready(function() { 
     var url = '/index.php/gettest/reallyLongRequest';    
     $.ajax({
       url: url,
       dataType:'text',
       success:function(data) { $('#result').html(data);},
       error:function(xhr,err,e) { alert ("Error: " + err);}
     });                
  //});
 </script>

答案 3 :(得分:-3)

可能想尝试添加async:true

<script type="text/javascript">  
       $(document).ready(function() { 
         var url = '/index.php/gettest/reallyLongRequest';    
         $.ajax({
           url: url,
           async:true,
           dataType:'text',
           success:function(data) { $('#result').html(data);},
           error:function(xhr,err,e) { alert ("Error: " + err);}
         });                
      });
     </script>