jquery在函数ajax函数中遇到全局变量问题

时间:2012-04-14 16:59:20

标签: javascript jquery

以下是代码:

var ret;
function fetch_data(param1){
  $.post(param1,
        function(data){
          if (data){
            ret = data*2;
            console.log("data", ret);
          }
          else{
            ret = 15;
            console.log("no data")
          }
        });
  return ret;
}

function hello(){
  ret = fetch_data("/post_data");
  console.log("from the main function", ret);
}

以上是我如何处理事情的简化模式。 我发一个网址请求并尝试获取值,根据返回值我操纵值并尝试将其返回给函数。 console.log显示fetch_data函数内的值,但不在hello函数内。含义不返回任何值。我在哪里弄错了?

1 个答案:

答案 0 :(得分:4)

在您的javascript进行初始ajax调用后,脚本的执行将继续执行return语句。此时尚未返回对您的请求的响应,因此您的回调函数尚未执行,这意味着还没有为ret分配值。您需要在回调函数中包含对hello的调用,以保证ret已被赋值。

  var ret;
    function fetch_data(param1){
      $.post(param1,
            function(data){
              if (data){
                ret = data*2;
                console.log("data", ret);
              }
              else{
                ret = 15;
                console.log("no data")
              }
              hello();
            });
    }

function hello(){
  ret = fetch_data("/post_data");
  console.log("from the main function", ret);
}

Ajax可以通过两种方式访问​​服务器。这些是同步的(脚本停止并等待服务器在继续之前发送回复)和异步(其中脚本允许页面继续被处理并且将在它到达时处理回复)。您的函数异步执行,这意味着fetch_data函数在ajax调用完成之前执行return语句。

活动顺序:

  1. fetch_data被称为
  2. fetch_data会触发ajax请求。
  3. 获取数据返回ret(未定义)
  4. hello function print ret to console
  5. 从服务器收到ajax响应
  6. ret被赋予基于ajax响应的值
  7. 我想进一步建议您将代码修改为我认为更好的方法。我相信这种方法比在回调中指定hello函数更能捕获你的意图。

        function fetch_data(param1,callback){
          $.post(param1,
                function(data){
                  callback(data);
                });
        }
    
    function hello(data){
        if (data){
           ret = data*2;
           console.log("data", ret);
         }
         else{
           ret = 15;
           console.log("no data")
         }
      console.log("from the main function", ret);
    }
    
    function hello2(data){
      //...different logic that modifies data
      console.log("from the main function", ret);
    }
    
    //Function call passing the hello function as a parameter
    fetch_data('/post_data', hello);
    
    //Function call that passes hello2 function as a parameter
    fetch_data('/post_data', hello2);