Jquery发布成功变量范围

时间:2010-04-01 21:31:32

标签: javascript ajax json variables scope

我正在尝试将ajax success数组从一个函数返回到另一个函数。出于某种原因,我似乎无法将存储在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;

}   

2 个答案:

答案 0 :(得分:6)

这部分功能发生在以后:

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

答案 1 :(得分:2)

$.ajax是一个异步函数。

这意味着当被调用时,该函数会继续执行。

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

  • 启动ajax调用(异步,函数继续执行)
  • return json_to_return(undefined)
  • days_data == undefined
  • ajax调用结束,json_to_return被分配(这可能在任何时间段内发生)

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

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