私のスクリプトはjQueryを介してAjaxリクエストを作成します。受信したデータは、サーバーサイドスクリプト(php)を介してjson_encodedされます。これはさらに文字列化され、jQueryを使用してparseJSONされ、recordCollectionが生成されます。recordCollectionをループして、コールバック関数のスコープ外で宣言された変数であるrecords配列にプッシュします。
関数は次のようになります。
var records = [] ;
$.getJSON(url, {id : recordid}, function(data) {
var recordCollection = jQuery.parseJSON(JSON.stringify(data));
$.each(recordCollection, function(){
records.push(this);
});
console.log(records) // displays all the objects, thus, the above code is right
});
console.log(records); // displays []
上記のように、2回目にレコードをコンソールにログオンすると、空の配列が生成され、2つの結論に至りました。
Javascript配列は値で渡されるため、コールバック関数のスコープ外のレコードはその値を保持しません。
Ajaxは非同期であるため、ajax呼び出しが完了する前にレコードがログに記録されます。したがって、空の初期化されていないレコード配列の値が保持され、コンソールに記録されます。
1が真の場合、レコード配列を初期化するにはどうすればよいですか?
そして、2が真の場合、このAjax呼び出しを同期させる必要がありますか?これにより、値が返されるまでjavascriptブロックが作成されるため、records配列がコンソールに2回目にログオンすると、配列の更新された値が表示されますか?
3つ目は、私がトリックを完全に見逃していて、ここで本当に馬鹿げたことをしていることです。
スクリプト内のさまざまなjavascript関数に渡す必要があり、DOMは基本的にこの結果がデータをロードするのを待つため、ajax呼び出しから返されたデータでrecords配列を設定する必要があります。
みんなありがとう!