【问题标题】:Waiting for multiple asynchronous JSON queries to finish before running code [duplicate]在运行代码之前等待多个异步 JSON 查询完成 [重复]
【发布时间】:2013-06-05 12:11:57
【问题描述】:

我希望同时运行多个不同的 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");
    });

【问题讨论】:

  • 这就是 promises 的用途。
  • 我不同意它是重复的,因为这里的解决方案比重复的更接近我在问题中的答案。
  • 当然可以,但是总体问题是一样的。

标签: javascript jquery json asynchronous callback


【解决方案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]);
    }
}

还可以通过
$.getJSON(...).fail(function () {console.log('error');});

向您的 json 请求添加错误处理程序

【讨论】:

  • 这让我大吃一惊。我打算稍后添加,但在检查 undefined 和 true 是否为真时没有意识到它们之间有任何区别。谢谢你
  • 关键变化是将变量声明移出函数,而不是将其放入函数中。为此不需要将它们的值从字符串更改为布尔值,但我无法查看其中的代码;)
  • 是的,我最初将它作为(我认为是布尔值),但它给了我错误。原来我使用的是 True 而不是 true。
  • 如果一个请求失败了怎么办?!不会从此请求成功回调中调用您完成的函数
  • 感谢指出,我添加了更多代码;)
猜你喜欢
  • 2020-12-02
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 2011-02-15
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多