4

重複の可能性:
jQuery で非同期ではなく同期の AJAX 要求を実行するにはどうすればよいですか?
ajax完了後に変数を取得する

次のコードの 2 つのアラート関数は、異なる結果を返します。私は2番目の評価もtrueにしようとしています..どんな助けも大歓迎です..ありがとう..

var array;

  $.get('php/getstocklist.php', function(data){  

  array = data; 
  alert($.isArray(array));    //alerts true

  }, "json");

alert($.isArray(array));      //alerts false
4

5 に答える 5

1

問題は、$.get非同期であることです。var は、現在のようにグローバルです。ajaxが返されて成功コールバックが実行される直前に2番目のアラートが実行されるため、定義されていません。

コールバックの外で使用するには、結果が割り当てられていることを確認するために変数をポーリングする必要があります...しかし、基本的に偽のコールバックを使用しているため、コードを再構築して通常どおりに実行する方が理にかなっています仕方 :-)

于 2012-08-03T16:36:27.027 に答える
0

私があなたを正しく理解しているなら、なぜあなたはできないのですか

$.getJSON('php/getstocklist.php', function(data){  
    dosomething(data);
});


function dosomething(data) {}
于 2012-08-03T17:05:52.133 に答える
0

何が起こっているかは次のとおりです。

// This variable _is_ global. However, it's current value is undefined
var array;

$.get('php/getstocklist.php', function(data){  

  // After this runs, _now_ array has data in it
  array = data; 

  // thus causing $.isArray to return true here.
  alert($.isArray(array));    //alerts true

}, "json");

// This call happens BEFORE the callback to the $.get call,
// so as of this line, array is still undefined, which results in 
// the $.isArray call returning false.
alert($.isArray(array));      //alerts false

Javascript は重い非同期言語です。プロシージャーの考え方から脱却し、後で実行するためにコードのビットを渡すという観点から考える必要があります (これらはcallbacksです)。

于 2012-08-03T16:32:59.447 に答える
0

$.get コールバックが非同期で実行されるため、2 番目のアラートは最初のアラートの前に実行されます。2 番目のアラートで true を返したい場合は、次のようにjQuery Deferred オブジェクトを使用する必要があります。

var array;

deferred = $.get('php/getstocklist.php', function(data){  

  array = data; 
  alert($.isArray(array));    //alerts true

}, "json");

// alerts true if $.get succeeded
deferred.done(function () { alert($.isArray(array)); }); 

渡すコールバックはdone、非同期の $.get 呼び出しが返されたときに起動します。

于 2012-08-03T16:43:47.683 に答える