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

时间:2015-02-25 12:11:09

标签: javascript jquery ajax

我的javascript中有以下情况:

  1. Ajax加载记录。
  2. 根据该记录的返回值,另一个ajax调用抓取一个添加到DOM中的html表单
  3. 当#2完成后,从#1获取的记录将被加载到#2中创建的表单中。
  4. 我正在使用when,这样当#2完成后,我可以从#1加载表单值。问题是,看来当不等待成功处理程序完成时,只有ajax调用自身。在继续使用值加载表单之前,我需要等待#2的成功函数完成(因为这是在DOM中创建表单的内容)。

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

4 个答案:

答案 0 :(得分:3)

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
             }
         });
      }
});

答案 1 :(得分:1)

你可以使用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/

答案 2 :(得分:1)

您应该使用whensuccess而不是两者。听起来好像(尽管代码示例会更清楚)你将两个独立的监听器连接到ajax调用,但是你只希望一个跟在另一个之后执行。
我要么将两者都推到一个事件中,如:

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

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

但是,如果你做了像

这样的事情
$.when($.ajax( ... , function(){
    // thing a
}).then(function(){
    // thing b
});

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

答案 3 :(得分:0)

迟到回答,但是

更好的方法是使用promises作为designed to be used

的方式

伪实现

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
});