我有一小段代码,可以从服务器读取一些ajax(这很有用)。

var self = this;
var serverItems = new Array();
var playersOnlineElement = $("#playersOnline");

function DataPair(k, v) {
    this.key = k;
    console.log("new datapair: " + k + ", " + v);
    this.value = v;
}

DataPair.prototype.getKey = function() {
    return this.key;
}

DataPair.prototype.getValue = function() {
    return this.value;
}

$.getJSON("http://127.0.0.1", function(data) {
    $.each(data, function(key, val) {
        var pair = new DataPair(key, val);
        self.serverItems.push(pair);
    });
});

console.log(serverItems.length); //Problem is here
for (var i = 0; i < serverItems.length; i = i + 1) {
    var dpair = serverItems[i];
    if (dpair.getKey() === "playersOnline") {
        self.playersOnlineElement.text("Players Online: " + dpair.getValue());
    }
}


数据对和JSON被加载,但是当它们被推到数组时似乎不起作用。我尝试使用self.serverItems和仅serverItems,因为如果仅使用serverItems,netbeans向我展示了变量的范围很好,但是我对为什么不起作用感到困惑。谁能帮我?

我在错误所在的地方添加了注释。即使在DOM树中的浏览器中进行调试时,serverItems.length仍为0,但它具有包含所有数据的数组serverItems。

假设此serverItems在另一个作用域中,而不是在我要获取长度时正在调用的那个作用域?

最佳答案

将此代码添加到成功部分,因为它是异步的...

for (var i = 0; i < serverItems.length; i = i + 1) {
    var dpair = serverItems[i];
    if (dpair.getKey() === "playersOnline") {
        self.playersOnlineElement.text("Players Online: " + dpair.getValue());
    }


至...

$.getJSON("http://127.0.0.1", function(data) {
    $.each(data, function(key, val) {
        var pair = new DataPair(key, val);
        self.serverItems.push(pair);

      for (var i = 0; i < serverItems.length; i = i + 1) {
        var dpair = serverItems[i];
        if (dpair.getKey() === "playersOnline") {
            self.playersOnlineElement.text("Players Online: " + dpair.getValue());
        }
    });
});

10-07 21:29