Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jquery post success变量范围_Javascript_Ajax_Json_Variables_Scope - Fatal编程技术网

Javascript Jquery post success变量范围

Javascript Jquery post success变量范围,javascript,ajax,json,variables,scope,Javascript,Ajax,Json,Variables,Scope,我试图将ajax成功数组从一个函数返回到另一个函数。出于某种原因,我似乎无法将存储在ajax函数成功部分的变量中的数据传递给父函数以返回 我看了这篇文章试图想办法解决问题,但不是运气好: 非常感谢您的帮助 下面是代码的简化版本: // make json_to_return global var json_to_return; function loop_through_data(){ // call the load_days function and put its array d

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

我看了这篇文章试图想办法解决问题,但不是运气好:

非常感谢您的帮助

下面是代码的简化版本:

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

}   

函数的这一部分稍后执行:

success: function(available_json){
                   json_to_return = available_json;
               }
因此,返回的变量是未定义的,因为设置该变量的代码在服务器返回响应之前不会发生。调用success函数运行代码的其余部分,以便在数据准备就绪时运行,或者设置
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);
               }
             });

$。ajax
是一个异步函数

这意味着调用时,函数将继续执行

在您提供的代码中
var days\u data=load\u days(032010)发生这种情况:

  • 启动ajax调用(异步,函数保持执行)
  • return
    json\u to\u return
    (未定义)
  • days\u数据
    ==未定义
  • ajax调用完成后,
    json\u to\u return
    被分配(这可以在任何时间跨度内发生)
您应该重新考虑您的逻辑,并开始围绕
ajax
调用的异步性进行编码


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

哪里有“保留我新的愚人节头像”按钮?谢谢,我没有意识到在帖子完成之前触发了返回。现在一切都有意义了。我将对事情进行重新调整,以便它们在成功中发生:我希望将其用作一个实用程序,可以从多个函数调用,但这将暂时起作用。