2

jQuery の $.getJSON() 関数を使用して、JSON ファイルから取得したオブジェクトを含む JavaScript オブジェクトに配列を作成しようとしています。$.getJSON() 関数内で配列要素が設定されているように見えるスコープの問題が発生していますが、その外側では配列が空です。コードは次のとおりです。

function player(playlist){
...
var tracks = [];

this.start = function() {
...
    $.getJSON(playlist, function(data){
        $.each(data.tracks, function(key,value){
            var track_info = function(info){return info}(value);
            tracks.push(track_info);
        });
        console.log("from .getJSON function");
        console.log(tracks);
    });
    console.log("outside .getJSON function");
    console.log(tracks);
    ...
};
...
$(document).ready(function(){
    var the_player = new player(playlist);
    the_player.start();
)};

出力は次のとおりです。

outside .getJSON function
[]
from .getJSON function
[Object, Object, Object]

また、すべてのオブジェクトには、JSON ファイルからの正しいデータが含まれています。

私はこの問題について当惑しています。誰かが理解するのを手伝ってくれますか?

4

2 に答える 2

4

ヒントは次の順序です。

outside .getJSON function
[]

に続く

from .getJSON function
[Object, Object, Object]

JSON 応答を取得する前に外側のコードが実行されているため、驚くことでtracksはありませんが、空です。これは直観に反するように思えるかもしれfrom .getJSON functionません。最初にソースに表示されますが、2 番目に実行されます! これは が.getJSON同期していないためです。次のステートメントに進む前に、コールバック引数を実行しません。すぐに次のステートメントに進み、後でコールバックを実行します。

于 2012-05-22T16:19:56.233 に答える
1

$.getJSON は AJAX 呼び出しであり、非同期です。つまりconsole.log("outside .getJSON function");、AJAX 呼び出しが返される (そして配列にデータが入力される) 前に呼び出されます。これが起こっていることのヒントは、出力が「内側」の前に「外側」と表示されることです

于 2012-05-22T16:19:37.240 に答える