1

私はこれで壁に頭をぶつけてきました。誰かが私が間違っていることを教えてもらえますか?

var foo = 100;

function loadData() {
   // this pops up a window that says it's 100
   alert(foo);  

   $.getJSON(myvars.constants.ajaxpath + "getsettings", function(data) {
      foo = 200;
      // this pops up a window that says it's 200
      alert(foo);
   });
   // this pops up a window that says it's 100
   alert(foo); 
}

getJSON() 呼び出し内でグローバル変数に設定した値は、getJSON() 呼び出し内でのみ有効です。関数が終了すると、グローバル変数は以前の値に戻ります。

getJSON() 呼び出し内からこのグローバル変数を設定するにはどうすればよいですか? .success()、.complete() なども使用してみました。100に戻すのではなく、200に設定したままにしたい.

ありがとう!

PS明らかに、getJSON()呼び出しでグローバル変数を使用して他のことを行っていますが、単純な変数設定は問題を説明するためのものです。

4

4 に答える 4

1

君の...

foo = 200

... ajaxリクエストが返されると呼び出されます。したがって、これは「最後」の後alert(foo)です。このスクリプトの実行が完了したら、開発者コンソールを開いて (F12) と入力するとfoo、200 が表示されます。

于 2012-08-25T06:04:19.900 に答える
1

変数はセットバックされませんalert。3 番目と最後の変数は、セットの前に単に呼び出されます。

非同期の JSON 呼び出しを使用しているため、実行は直線的ではありません。ほとんどの場合、そのコードは次のようになります。

var foo = 100;

function loadData() {
   // this pops up a window that says it's 100
   alert(foo);  

   // The call is sent at this point
   $.getJSON(myvars.constants.ajaxpath + "getsettings");

   // this pops up a window that says it's 100
   alert(foo); 
}

// Some time later, after the server responds, this function is actually run

function(data) {
   foo = 200;
   // this pops up a window that says it's 200
   alert(foo);
});

alert を呼び出すか、呼び出しが返された後に表示するか、JSON 呼び出しを同期に設定することで、これを簡単にテストできます。これにより、foo期待どおりに実行が強制されます (ただし、非常に貧弱な方法です)。

于 2012-08-25T06:06:41.973 に答える
0

これを試して

var foo = 100;

function loadData() {

   alert(foo);  
   $.ajax({
      async: false,
      url: myvars.constants.ajaxpath + "getsettings",
      dataType: "json",
      success: function(data) {
      foo = 200;
      alert(foo);
   }
 });
  alert(foo); 
} 
于 2012-08-25T06:42:36.957 に答える
0

ここでは、成功イベントでコールバックを設定します。このコールバックは、ajax リクエストが正常に完了したときに呼び出されます。

$.getJSON(myvars.constants.ajaxpath + "getsettings", function(data) {
  foo = 200;
  alert(foo);
});

foo を警告する最後の行が先に実行されます。したがって、ajax reqest の後、変数は 200 になります。

于 2012-08-25T06:01:22.157 に答える