在运行代码之前等待多个异步JSON查询完成

时间:2013-06-05 12:11:58

标签: javascript jquery json asynchronous callback

我希望同时运行多个不同的JSON请求,然后只有在完成或返回错误消息后才执行函数(404等)。这是我到目前为止所做的,但函数finished不记得任何一个请求中的变量。有什么想法吗?

function socialPosting(a_date,a_title,a_source,a_thumbnail,a_url) {
        socialPosts[socialPosts.length] = {date: a_date, title: a_title, source: a_source, thumbnail: a_thumbnail, url: a_url};
        //console.log(socialPosts[amount]);
        //console.log(amount);
    }

function finished(source) {
        if (source == "Twitter") {
            var Twitter = "True";
        }
        if (source == "YouTube") {
            var YouTube = "True";
        }
        console.log(source); //diagnostics
        console.log(Twitter); //diagnostics
        console.log(YouTube); //diagnostics
        if (Twitter == "True" && YouTube == "True") { 
            console.log(socialPosts[0]); //Should return after both requests are complete
        }
    }

$.getJSON('https://gdata.youtube.com/feeds/api/videos?author=google&max-results=5&v=2&alt=jsonc&orderby=published', function(data) {
        for(var i=0; i<data.data.items.length; i++) { //for each YouTube video in the request
            socialPosting(Date.parse(data.data.items[i].uploaded),data.data.items[i].title,"YouTube",data.data.items[i].thumbnail.hqDefault,'http://www.youtube.com/watch?v=' + data.data.items[i].id); //Add values of YouTube video to array
        }
        finished("YouTube");
    });

$.getJSON("https://api.twitter.com/1/statuses/user_timeline/twitter.json?count=5&include_rts=1&callback=?", function(data) {
        var amount = socialPosts.length;
        for(var i=0; i<data.length; i++) {
            socialPosting(Date.parse(data[i].created_at),data[i].text,"Twitter"); //Add values of YouTube video to array
        }
        finished("Twitter");
    });

1 个答案:

答案 0 :(得分:1)

试试这个,在你的解决方案中,Twitter和Youtube是函数中的局部变量,在函数返回之后它们不再存在,如果函数再次被调用,它们又被重新开始,但当然它们没有值上次因为它们是新变量,可能谷歌搜索“javascript变量范围”以获取有关此主题的更多信息。

var Twitter = false;
var YouTube = false;
function finished(source) {
    if (source == "Twitter") {
        Twitter = true;
    }
    if (source == "YouTube") {
        YouTube = true;
    }
    console.log(source);
    console.log(Twitter);
    console.log(YouTube);
    if (Twitter && YouTube) { 
        console.log(socialPosts[0]);
    }
}

还通过
向json-request添加错误处理程序 $.getJSON(...).fail(function () {console.log('error');});