-1

我正在尝试获取 3 个不同的 Facebook 提要并将它们放入一个对象中。该对象是项目,它具有创建帖子的时间,以及来自 JSON 包的实际数据对象本身。当我记录 items 数组时,当我检查日志时它只显示 5 个项目,但是当我在日志内展开数组时,它显示了我推送的所有 15 个项目。调用 items[0] 到 4 有效,但之后它说该项目未定义。我不太确定我做错了什么,因为似乎所有数据都在 items 数组中。

function item(time, obj)
{
    this.time = time;
    this.obj = obj;
}

    $(document).ready(function() {
        var items = [];
        $.getJSON("http://feed1", function(obj) {                   
            $.each( obj.data, function( key, val ) {
                items.push(new item(val.created_time,val));
            });
        }); 
        $.getJSON("http://feed2", function(obj) {                   
            $.each( obj.data, function( key, val ) {
                items.push(new item(val.created_time,val));
            });
        });
        $.getJSON("http://feed3", function(obj) {                   
            $.each( obj.data, function( key, val ) {
                items.push(new item(val.created_time,val));
            }); 
            console.log(items); // shows 5 items, but expanded, shows 15 while inspecting
            console.log(items[0].time); // Works
            console.log(items[5].time); // Fails
        });
            console.log(items);  // shows an empty items array
    });
4

1 回答 1

3

Ajax 是异步的,因此当您执行console.log()语句时,可能并非所有调用都已完成。解决您的问题的一个简单方法是获取每个请求的承诺并等待所有请求完成:

$(document).ready(function () {
    var items = [];
    var feed1 = $.getJSON("http://feed1", function (obj) {
        $.each(obj.data, function (key, val) {
            items.push(new item(val.created_time, val));
        });
    });
    var feed2 = $.getJSON("http://feed2", function (obj) {
        $.each(obj.data, function (key, val) {
            items.push(new item(val.created_time, val));
        });
    });
    var feed3 = $.getJSON("http://feed3", function (obj) {
        $.each(obj.data, function (key, val) {
            items.push(new item(val.created_time, val));
        });        
    });

    $.when(feed1, feed2, feed3).done(function() {
        console.log(items); 
    });
});
于 2013-09-24T19:22:57.350 回答