0

関数外のオブジェクトにアクセスしたい関数内でjsonオブジェクトを複製しようとしています。しかし、機能が完了すると、オブジェクトはまだ定義されていないようです。同じ変数ではないようですか?

var jsonUserObj;
$.getJSON("user.json", function(content){
    jsonUserObj = $.parseJSON(JSON.stringify(content));
    console.log(content);
    console.log(jsonUserObj); //looks fine!
});
console.log(jsonUserObj); //undefined

コールバック関数の内部にはすべてのデータが含まれていますが、外部には残りません。グローバルに評価できるようにする方法は?

4

5 に答える 5

2

$.getJSON は非同期であるため、コードの最後にある console.log は、$.getJSON が結果を返す前に実行されます。

コールバック内の変数を変更し (問題ないように見えます)、その関数内で変数を使用する必要があります。このコールバックは、変数が設定されていることを保証できる唯一の場所です。

$.ajax の同期バージョンを使用することもできますが、これは実際にはお勧めできません (おそらく不要です)。

于 2012-10-23T13:28:22.727 に答える
1

タイプミスがあります:

console.log(jsonUserObject);

そのはず

console.log(jsonUserObj);
于 2012-10-23T13:28:08.820 に答える
0

var jsonUserObj関数の外で宣言する必要があります。

また、typeo があるように見えますが、それは jsonUserObj ですか、それとも jsonUserObject ですか?

于 2012-10-23T13:27:47.467 に答える
0

タイミングの問題だろうか。その getJSON メソッドが非同期で起動している場合、最後の行を起動するまでに値が返されていない可能性があります。それは理にかなっていますか?

于 2012-10-23T13:28:48.493 に答える
0

$.getJSON非同期の ajax 呼び出しを実行します。その後のコードは、応答を待っている間も評価を続けます。応答が戻ってくると、プログラム フローは ajax 呼び出しの成功/エラー/完了ハンドラーに戻ります。

tldr: ajax 呼び出しからのデータで行うことはすべて、その ajax 呼び出しの成功ハンドラーにある必要があります。

于 2012-10-23T13:33:52.650 に答える