如何解决这个双ajax调用问题

时间:2012-11-06 23:06:40

标签: javascript jquery ajax

我试图在用户点击按钮时进行2次ajax函数调用。

我有

$('.test').on('click', function(){

    code.getCode();
        code.getText();
})

code.prototype.getCode=function(){
     var call=//call ajax
     call.callback= function(data){
          //parse return data
    }
}


code.prototype.getText=function(){
     var call=//call ajax
     call.callback= function(data){
          //parse return data
    }
}

我只能进行1次ajax调用,只有1次ajax调用会返回数据。 我不知道如何解决这个问题。有任何想法吗?非常感谢!

3 个答案:

答案 0 :(得分:2)

我不确定我是否理解正确,但我认为您正在寻找来自两个ajax调用的单个回调..

您应该使用 $.when.done 。见下文,

$.when($.ajax("/page1.php"), $.ajax("/page2.php")).done(function(a1,  a2){
    /* a1 and a2 are arguments resolved for the 
        page1 and page2 ajax requests, respectively */
   var jqXHR = a1[2]; /* arguments are [ "success", statusText, jqXHR ] */
   if ( /Whip It/.test(jqXHR.responseText) ) {
      alert("First page has 'Whip It' somewhere.");
   }
});

不确定您是在寻找排序还是尝试进行1次回调。

答案 1 :(得分:0)

你也可以进行第一次ajax调用,成功调用第二次:

$('.test').on('click', function(){

var datastr = "your data";

 $.ajax({  
  type: "POST",  
  url: "url",  
  data: datastr,  
  success: function(successMsg) {                   
          //ajax done
          if (/* not yet complete */) {
            setTimeout(secondAjaxCall(),500);
          } else {
            secondAjaxCall();
         }
      }
  });

});

答案 2 :(得分:0)

您可以在代码对象中保存每个返回(因为您在不同的上下文中,您必须解决“this”)。然后你可以使用第三个函数来检查数据对象是否被加载......并且一旦两者都存在就开始解析。

$('.test').on('click', function(){
    code.getCode();
    code.getText();
})
code.prototype.getCode=function(){
     var call=//call ajax
     var that = this;
     call.callback= function(data){
          //parse return data
          that.codeData = data;
          parseData();
    }
}
code.prototype.getText=function(){
     var call=//call ajax
     var that = this;
     call.callback= function(data){
          //parse return data
          that.textData = data;
          parseData();
    }
}
function parseData() {
 if(!code.textData || !code.codeData) return;
 ... work with both
}