如何在执行另一个之前等待ajax成功处理程序完成

我的javascript中有以下场景:

  1. Ajax加载记录。
  2. 根据该记录的返回值,另一个ajax调用抓取一个添加到DOM中的html表单
  3. 当#2完成时,从#1获得的记录然后被加载到#2中创建的表单中。

我使用的是当#2完成时,我可以从#1加载表单值。 问题是,看来当等待成功处理程序完成时,只有ajax调用本身。 在继续使用值加载表单之前,我需要等待#2的成功函数完成(因为这是在DOM中创建表单的内容)。

如果我在步骤#2添加alert1 ,它就可以工作(我猜测是因为它正在等待点击警报,并且在那个时候,成功处理程序已经完成。

success回调中使用嵌套函数执行类似的操作:

 $.ajax({ url: "somewhere" success: function(data1){ //Use data1 to determine ajax request #2 $.ajax({ url: "somewhere else" success: function(data2){ //Do stuff with data1 and data2 } }); } }); 

您应该使用whensuccess而不是两者。 听起来(虽然代码示例会使这个更清晰)你将两个独立的侦听器附加到ajax调用,但是你只想要一个执行另一个。
我要么把两者都卷成一个事件,比如:

 $.ajax( ... , function(){ // success // prep stuff here $.ajax( ... , function(){ // second success // do final stuff here }); }); 

或者在另一个promise中包含ajax调用(这可能需要更多关于jQuery promise的阅读)。

但是,如果你做了类似的事情

 $.when($.ajax( ... , function(){ // thing a }).then(function(){ // thing b }); 

事物a和b将同时执行,因为它们的设计几乎完全相同。

你可以使用jQuery promises,即:

 var loadingData = $.get(loadDataUrl); var loadingHtml = $.get(grabHtmlUrl); $.when(loadingData, loadingHtml).done(function(loadDataResult, loadHtmlResult){ //add the html to the dom //use data to update the dom as you please }); 

注意:$ .get只是执行get请求的$ .ajax版本

资料来源: http : //api.jquery.com/deferred.promise/

http://api.jquery.com/jquery.get/

http://api.jquery.com/jquery.ajax/

http://api.jquery.com/jquery.when/

有点迟来回答,但是

更好的方法是使用promises作为他们设计使用的方式

伪实现

 var promise = $.ajax({ url: url, data: data }).done(function (data) { var result = process(data); return $.ajax({ url: url, data: result }); }).done(function (data) { // data is the result of second ajax call });