Jquery / JS范围

时间:2012-11-16 18:39:27

标签: javascript jquery

这可能很简单,但它让我很难过。我试图将javascript中的变量返回到函数范围之外的另一个变量。出于某种原因,分配没有发生。这是我的代码:

var time = Math.round(((new Date()).getTime())/1000);

// first call to get data
var power_now = get_data(<%= @user.id %>, time);

function get_data(user_id, timestamp){
  var targetURL = "get/user_data?time_now="+timestamp+"&user_id="+user_id;
  var power = 0;

  $.get(targetURL, function(data){
    power = data[0]['power'];
    alert(power);
  })

  return power;
}

$('body').html('<h1>'+power_now+','+power_then+'</h1>')

如果我在.get函数中放置警报(电源),则值是正确的;但是,如果我将它放在.get函数之外,则值为0.

也许我在javascript中缺少一些关于作用域的东西?

谢谢!

3 个答案:

答案 0 :(得分:4)

get.ajax的同义词,其中设置了一些特定参数。 AJAX中的第一个A是异步的。这意味着代码不会立即执行,它会发送请求并继续运行。因此,在返回语句之后才会分配该变量。

相反,您应该将代码移动到回调中:

$.get(targetURL, function(data){
    power = data[0]['power'];

    $('body').html('<h1>'+power_now+','+power_then+'</h1>')
})

答案 1 :(得分:2)

$.get是一个aysc AJAX调用,意味着该函数甚至会在服务器响应之前返回0。

您需要使用回调函数来设置power_now或调用相应的代码。

如果代码适用,您可以修改下面的代码,

var power_now = 0;
get_data(<%= @user.id %>, time);

function get_data(user_id, timestamp){
  var targetURL = "get/user_data?time_now="+time+"&user_id="+<%= @user.id %>;

  $.get(targetURL, function(data){
    power_now = data[0]['power'];
    $('body').html('<h1>'+power_now+','+power_then+'</h1>')
  })
}    

答案 2 :(得分:2)

$.get是一个异步的ajax调用。您需要在成功函数中指定结果操作。

var time = Math.round(((new Date()).getTime())/1000);

// first call to get data
var power_now = get_data(<%= @user.id %>, time);

function get_data(user_id, timestamp){
  var targetURL = "get/user_data?time_now="+time+"&user_id="+<%= @user.id %>;
  var power = 0;

  $.get(targetURL, function(data){
    power = data[0]['power'];
    alert(power);
  })

  .success(function() { $('body').html('<h1>'+power+','+power_then+'</h1>') })
}