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

4
如何将嵌套的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个回答

7

由于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..
});

正如标题所示 - 我们想要返回它,而不是“处理它”。就像这里:http://stackoverflow.com/questions/35508182/js-return-from-nested-function-after-ajax-call - pesho hristov

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

您需要将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);

他没有说必须是 :) - Jan Hančič
太棒了!谢谢Hancicicicici!非常有趣,我不知道你可以去除这个函数的异步性质。还有其他的jQuery函数可以应用这个方法吗? - wilsonpage
2
将AJAX同步化是不可取的。适当的方法是将处理响应的代码转换为传递给myFunction的续延,正如José的答案所示。 - outis

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

啊,arguments.callee() 函数是做什么用的? - wilsonpage
它将调用自身所在的函数self。 - Prakash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接