关于javascript:如何等待ajax调用返回

how to wait for an ajax call to return

我正在尝试使用JQuery,虽然我在努力成功等待ajax调用成功然后执行更多代码。 有没有办法等待ajax打电话? 我见过一些例子,但似乎只是盲目地等待x秒钟?

谢谢,
詹姆士


是的,您可以同步请求:

1
2
3
4
5
6
7
8
9
10
11
12
var bodyContent = $.ajax({
      url:"script.php",
      global: false,
      type:"POST",
      data: {id : this.getAttribute('id')},
      dataType:"html",
      async:false,
      success: function(msg){
         alert(msg);
      }
   }
).responseText;

资料来源:http://api.jquery.com/jQuery.ajax/

但是,同步请求是一个倒退,因为JS引擎(在某些浏览器中,用户界面)将阻塞,直到请求完成。 Douglas Crockford曾写过关于同步请求的文章:

Synchronous programming is disrespectful and should not be employed in applications which are used by people.


看看jQuery deferreds。您不能暂停此操作,但可以在AJAX调用返回后调用其他代码。

1
2
3
// No way to stop.
$.ajax(...);
doSomething();

但是通过延期,您可以:

1
2
3
$.ajax(...).success(function() {
   doSomething();
});

看到这篇文章。

http://www.erichynds.com/jquery/using-deferreds-in-jquery/


jQuery的ajax方法有一个成功的处理程序。

您应该将您想要触发的代码放在附加到此处理程序的方法中。

考虑jQuery网站上给出的示例:

1
2
3
4
5
6
7
$.ajax({
  url:"test.html",
  context: document.body,
  success: function(){
    $(this).addClass("done");
  }
});

你可以在这里看到有一个附加方法的success处理程序。当ajax方法成功返回时,将执行此方法。

正如其他答案和下面的评论中所指出的,您现在可以使用延迟而不是这个简单的success handeler。这允许您将多个操作附加到每个给定的事件。


您可以使用成功或完整的回调。如果服务器返回200,则会触发成功。无论响应状态如何,完成将在请求完成时触发。

1
2
3
4
5
6
7
8
9
$.ajax({
    url:"/path/to/action",
    success: function() {
        alert("do something if it's successful");
    },
    complete: function(request, status) {
        alert("do something when it's finished, regardless of success.");
    }
});

或者你可以做同步通话:

1
2
3
4
$.ajax({
    url:"/path/to/action",
    async: false
});

  • 使用async:false
  • 或使用回调函数

  • 您必须在"成功"功能中插入代码:http://api.jquery.com/jQuery.ajax/