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>')

.get関数内にalert(power)を配置すると、値は正しいです。ただし、.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はayscAJAX呼び出しであり、サーバーが応答する前でも関数が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 に答える