JS:从嵌套的ajax成功函数返回结果

时间:2011-03-23 09:49:11

标签: javascript jquery ajax

如何作为父函数的结果返回嵌套ajax调用的结果?

//Declaring the function
var myFunction = function(myData){  
  $.ajax({
  type:'post',
  url:"/ajaxPage.php",
  data:{data:myData},
  success:function(r){
  return r;
  });
}

//Calling the function
var theResult = myFunction(myData);

我希望变量'theResult'能够保存ajax调用的内容。

4 个答案:

答案 0 :(得分:6)

由于ajax是异步的,因此无法在父函数中返回它。 你可以做的是提供一个回调函数,你也可以用它来调用它。

 //Declaring the function

var myFunction = function(myData, callback){  
  $.ajax({
  type:'post',
  url:"/ajaxPage.php",
  data:{data:myData},
  success:function(r){
    callback(r);
  });
}


//Calling the function
var theResult = myFunction(myData, function(res) {
    // deal with it..
});

答案 1 :(得分:3)

如果您使用的是jQuery,那么您肯定应该使用$.Deferred()Promises/A。我已经使这个更加冗长,你真的需要展示一些功能。 $.ajax本身已经返回$.Deferred().promise(),因此如果您只需要发出一个XHR请求,您实际上可以删除额外的步骤(参见下面的示例)。

//Declaring the function
var myFunction = function(myData){
  var deferredResponse = new $.Deferred();
  $.ajax({
    type:  'post',
    url:   '/ajaxPage.php',
    data: {'data': myData}
  }).done(deferredResponse.resolve).fail(deferredResponse.reject);
  return deferredResponse.promise();
}

//Calling the function
$.when(myFunction(myData)).done(function(response){
  var theResult = response;
});

当您有多个嵌套的XHR请求并希望返回最内层调用的响应时,详细语法会派上用场:deferredResponse.resolve(innerResponse)。这是简单的版本。

//Declaring the function
var myFunction = function(myData){
  return $.ajax({
    type:  'post',
    url:   '/ajaxPage.php',
    data: {'data': myData}
  });
}

//Calling the function
myFunction(myData).done(function(response){
  var theResult = response;
});

答案 2 :(得分:1)

您必须使AJAX调用同步(不是默认的异步)。

这样的事情:

//Declaring the function
var myFunction = function(myData){
  var returnValue = null;
  $.ajax({
  type:'post',
  async: false,
  url:"/ajaxPage.php",
  data:{data:myData},
  success:function(r){
  returnValue = r;
  });

  return returnValue;
}

//Calling the function
var theResult = myFunction(myData);

答案 3 :(得分:1)

试试这个:

var myFunction = function(myData){  
  $.ajax({
  type:'post',
  url:"/ajaxPage.php",
  data:{data:myData},
  success:function(r){
       return arguments.callee(r);
  });
}

//Calling the function
var theResult = myFunction(myData);