【问题标题】:Multiple AJAX calls on page load页面加载时的多个 AJAX 调用
【发布时间】:2012-05-22 12:15:48
【问题描述】:

我正在尝试从外部资源中提取两个独立的内容,并将其放到我正在创建的 HTML 页面上。我有一个成功的 AJAX 功能,可以通过解析该频道的 XML/RSS 提要从特定的 Youtube 频道提取最新视频。我通过 AJAX 调用收到此提要。

我还想从 Blogger 帐户获取最新的博文。解析提要以获取最新条目的代码应该不难,但我在同时调用 AJAX 时遇到了麻烦。我在某处读到它一次只能处理一个?我厌倦了排队,因为我不希望页面上的内容分步加载。我宁愿同时获取所有内容。我该怎么做呢?

这是我当前的脚本:

<script type="text/javascript" charset="utf-8">
    $(function() {
      $.ajax({
        type: "GET",
        url: "http://gdata.youtube.com/feeds/base/users/devinsupertramp/uploads?orderby=updated&alt=rss&client=ytapi-youtube-rss-redirect&v=2",
        dataType: "xml",
        success: parseXml
      });
    });

    function parseXml(xml) {
        $(xml).find("item:first").each(
            function() {
                var tmp = $(this).find("link:first").text();
                tmp = tmp.replace("http://www.youtube.com/watch?v=", "");
                tmp = tmp.replace("&feature=youtube_gdata", "");
                var tmp2 = "http://www.youtube.com/embed/" + tmp + "?autoplay=1&controls=0&rel=0&showinfo=0&autohide=1";
                var iframe = $("#ytplayer");
                $(iframe).attr('src', tmp2);
            }
        );
    }
</script>

【问题讨论】:

  • 根据定义,您的前提(AFAIK 不正确,但特定于浏览器)几乎不允许任何其他操作,而不是逐个调用,不是吗?另一种选择是在服务器端进行调用并聚合结果,允许通过单个客户端调用获取所有数据。
  • 博客网址是什么?这两个是关于提要的?
  • @DaveNewton,是的,我想是的。我可能最终只是在服务器端进行。话虽这么说,如果我决定不汇总结果,我会怎么做呢?还有奥斯卡,你在问什么?
  • 算了 :-) 嗯,您想获取提要链接以将它们放入 iframe 中吗?或者你到底想做什么。
  • @OscarJara,上面的函数从 Youtube 频道拉取最新视频并将其放在页面上。我需要编写另一个函数,该函数将从单独的 RSS 提要中提取最新的博客文章,因此需要两个单独的请求。

标签: ajax jquery request


【解决方案1】:

我在某处读到它一次只能处理一个?

要么你误解了对方想说的话,要么他们不正确。 Javascript 不会同时运行任何函数,因此英语不好的人可能会将其改写为“一次只能处理一个”,但这并不意味着您不能进行多个 AJAX 调用。 jQuery 很聪明,它会做它需要做的事情来确保最终执行这两个调用。

如果您希望同时加载所有内容,可悲的事实是您不能。但是,您可以通过声明由每次调用的成功方法设置的标志来使其向用户显示。然后将内容隐藏起来,直到两个标志都设置完毕。

编辑:

这是一种非常简单的方法,可以使它们看起来是同时获取的:

<script type="text/javascript" charset="utf-8">
    var youtubComplete = false;
    var otherComplete = false;

    $(function() {
      $.ajax({
        type: "GET",
        url: "http://gdata.youtube.com/feeds/base/users/devinsupertramp/uploads?orderby=updated&alt=rss&client=ytapi-youtube-rss-redirect&v=2",
        dataType: "xml",
        success: parseXml
      });
      $.ajax({
        type: "GET",
        url: "http://someotherdata.com/",
        dataType: "xml",
        success: function() { otherComplete = true; checkFinished(); }
      });
    });

    function parseXml(xml) {
        $(xml).find("item:first").each(
            function() {
                var tmp = $(this).find("link:first").text();
                tmp = tmp.replace("http://www.youtube.com/watch?v=", "");
                tmp = tmp.replace("&feature=youtube_gdata", "");
                var tmp2 = "http://www.youtube.com/embed/" + tmp + "?autoplay=1&controls=0&rel=0&showinfo=0&autohide=1";
                var iframe = $("#ytplayer");
                $(iframe).attr('src', tmp2);
            }
        );
        youtubeComplete = true;
        checkFinished();
    }
    function checkFinished()
    {
        if(!youtubeComplete || !otherComplete) return;
        // ... Unhide your content.
    }
</script>

【讨论】:

  • 好主意。它不能处理多个,这似乎很奇怪,所以谢谢你澄清这个问题。那么,我的代码中肯定做错了什么,因为我的第二个请求不起作用,它要么覆盖了第一个请求,要么就是不正确,因为第一个请求没有给我任何输出。
  • @Jon - 我编辑了我的答案。如果您尝试以类似的方式发出多个 AJAX 请求,并且在发布该代码时它没有按预期执行,那么我或其他人将帮助您找出问题所在。 :)
  • 我想通了。这是一个愚蠢的错误。谢谢您的帮助!我可能会使用您发布的方法 - 看起来它应该正是我想要的。我很感激!
【解决方案2】:

浏览器将支持多个出站呼叫,但每个域有一个上限。看看这个相关的 Q/A How many concurrent AJAX (XmlHttpRequest) requests are allowed in popular browsers?

有几个很好的库可以进行请求调度,包括链接和并行化 AJAX 调用。一个很好的库是https://github.com/kriskowal/q,它提供了异步承诺框架来支持任意复杂的 AJAX 请求链接。 Q 缩小后约为 3.3KB。

// The jQuery.ajax function returns a 'then' able
Q.when($.ajax(url, {dataType: "xml"}))
  .then(function (data) {
     var parsedXML = parseXML(data)
     ...
     // some other ajax call
     var urls = [Q.when($.ajax(url2, {data: {user: data.userId}})),
                 Q.when($.ajax(url3, {data: {user: data.userId}}))];
     // run in parallel
     return Q.all(urls)
  })
  .then(function (data) {
    // data retrieved from url2, url2
  })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多