将对象从JSON推送到数组

时间:2013-09-24 19:13:18

标签: javascript jquery json

我正在尝试获取3种不同的Facebook提要并将它们放入一个对象中。对象是item,它具有创建帖子的时间,以及来自JSON包的实际数据对象本身。当我记录items数组时,当我检查日志时它只显示5个项目,但是当我在日志中展开数组时,它会显示我推送的所有15个项目。调用项目[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
    });

1 个答案:

答案 0 :(得分: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); 
    });
});