0

这可能很简单,但它难倒我。我正在尝试将 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>')

如果我将 alert(power) 放在 .get 函数中,则该值是正确的;但是,如果我将它放在 .get 函数之外,则值为 0。

也许我错过了一些关于 javascript 范围的东西?

谢谢!

4

3 回答 3

4

get.ajax一些特定参数集的同义词。AJAX 中的第一个 A 是异步的。这意味着代码不会立即执行,它会发送请求并继续前进。因此,该变量的赋值直到 return 语句之后才会发生。

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

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

    $('body').html('<h1>'+power_now+','+power_then+'</h1>')
})
于 2012-11-16T18:43:25.367 回答
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>')
  })
}    
于 2012-11-16T18:41:45.420 回答
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>') })
}
于 2012-11-16T18:45:46.697 回答