2

我正在尝试在我的 JavaScript 对象中创建一个数组,其中包含使用 jQuery 中的 $.getJSON() 函数从 JSON 文件中提取的对象。我遇到了范围问题,似乎在 $.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首先出现在源代码中,但执行第二!这是因为.getJSON不是同步的。在继续下一条语句之前,它不会执行其回调参数。它立即继续下一条语句,稍后执行回调。

于 2012-05-22T16:19:56.233 回答
1

$.getJSON 是一个 AJAX 调用,并且是异步的。这意味着您console.log("outside .getJSON function");在 AJAX 调用返回(并填充数组)之前被调用。这就是正在发生的事情的提示是,您在“内部”之前看到“外部”的输出

于 2012-05-22T16:19:37.240 回答