【问题标题】:JS : Return result from nested ajax success functionJS:从嵌套的ajax成功函数返回结果
【发布时间】:2011-03-23 09:49:11
【问题描述】:

如何将嵌套 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 调用的内容。

【问题讨论】:

    标签: javascript jquery ajax


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    如果您使用的是 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;
    });
    

    【讨论】:

      【解决方案3】:

      您必须使您的 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);
      

      【讨论】:

      • 他没说一定要这样:)
      • 太棒了!谢谢你汉西西西奇!非常有趣,我不知道你可以删除这个函数的异步特性。还有其他可以应用的jquery函数吗?
      • 使 AJAX 同步是倒退的。适当的方法是将处理响应的代码转换为传递给 myFunction` 的延续,如 José 的回答所示。
      【解决方案4】:

      试试这个:

      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() 函数是做什么的?
      • 它会调用它所在的函数self。
      猜你喜欢
      • 2011-11-18
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 2016-08-29
      • 2016-06-01
      • 1970-01-01
      相关资源
      最近更新 更多