【问题标题】:Jquery post success variable scopeJquery发布成功变量范围
【发布时间】:2010-04-01 21:31:31
【问题描述】:

我正在尝试将 ajax 成功数组从一个函数返回到另一个函数。由于某种原因,我似乎无法将 ajax 函数成功部分中存储在变量中的数据传递给父函数以返回。

我查看了这篇文章以尝试解决问题,但运气不佳: jQuery Ajax call - Set variable value on success

非常感谢您的帮助。

这是代码的简化版本:

// make json_to_return global
var json_to_return;

function loop_through_data(){

  // call the load_days function and put its array data into days_array
  var days_data = load_days(03,2010);

  // I'd like to be able to iterate through days_data here
  //
  //
}

function load_days(selectedMonth, selectedYear){  
                  $.ajax({
                   type: "POST",
                   dataType: "json",
                   url: "../includes/get_availability.php",
                   data: "month=" + selectedMonth + "&year=" + selectedYear,
                   success: function(available_json){
                       json_to_return = available_json;
                   },
                   error: function(msg){
                    alert("error " + msg);
                   }
                 });
               return json_to_return;

}   

【问题讨论】:

    标签: javascript ajax json variables scope


    【解决方案1】:

    这部分函数稍后发生:

    success: function(available_json){
                       json_to_return = available_json;
                   }
    

    所以您返回的变量是未定义的,因为设置它的代码在服务器返回响应之前不会发生。要么调用其余代码从你的成功函数运行,所以它会在数据准备好时运行,或者设置async:false(不太理想,因为它会锁定浏览器)。

    async: false 方法是这样的:

                  $.ajax({
                   type: "POST",
                   async: false,
                   dataType: "json",
                   url: "../includes/get_availability.php",
                   data: "month=" + selectedMonth + "&year=" + selectedYear,
                   success: function(available_json){
                       json_to_return = available_json;
                   },
                   error: function(msg){
                    alert("error " + msg);
                   }
                 });
    

    更好的方法:

                  $.ajax({
                   type: "POST",
                   dataType: "json",
                   url: "../includes/get_availability.php",
                   data: "month=" + selectedMonth + "&year=" + selectedYear,
                   success: function(available_json){
                       loopThroughTheDaysAndDoStuff(available_json);
                   },
                   error: function(msg){
                    alert("error " + msg);
                   }
                 });
    

    【讨论】:

    • 谢谢,我没有意识到在帖子完成之前返回已触发。这下全说通了。我会重新调整事情,以便它们成功地发生:我希望将它用作我可以从多个函数调用的实用程序,但这现在可以工作。
    【解决方案2】:

    $.ajax 是一个异步函数。

    意思是当被调用时,函数一直在执行。

    在您提供的var days_data = load_days(03,2010); 代码中会发生这种情况:

    • 启动 ajax 调用(异步,函数不断执行)
    • 返回json_to_return(未定义)
    • days_data == 未定义
    • ajax 调用完成,json_to_return 被分配(这可能发生在任何时间跨度)

    您应该重新考虑您的逻辑,并围绕 ajax 调用的异步性开始编码。

    第一种方法可能是将函数(回调)传递给 load_days,在 ajax 调用成功后调用该函数。

    【讨论】:

    • “保留我的新愚人节头像”按钮在哪里?
    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    相关资源
    最近更新 更多