【问题标题】:Multiple jquery Cross Domain JSONP requests with each with the same callback多个 jquery Cross Domain JSONP 请求,每个请求具有相同的回调
【发布时间】:2011-12-15 07:41:15
【问题描述】:

有人可以告诉我如何使用相同的 jsonp 回调创建 3 个 jsonp 跨域请求,这些回调只是获取内容并将其写入页面?

我正在尝试构建一个 url 数组来循环遍历,我想为每个 url 触发一个 jsonp 请求。对于每个响应,我想获取该 json 对象,然后将数据写入页面的一部分。我不在乎它的顺序。如果我使用 $.each 函数,我不需要考虑范围吗?因为我只定义了 1 个回调函数,并且我想覆盖 jsonp 回调,所以它总是调用相同的函数,但该函数足够聪明,可以知道返回了哪个对象并将其写入页面。

这是我的代码:

    $(document).ready(function() {
        $.getJSON('/server/webcontent/js/env-urls-local.js', function(data) {


                $.each(data.env.urls, function(index, url) {
                        //alert(url.path);
                        $.ajax({
                            url: url.path, 
                            dataType: 'jsonp',
                            async: false,
                            cache: false,
                            done: function(sData, textStatus, jqXHR){

                                var targetreleasediv = "." + url.target + ' td:nth-child(2)';
                                var targetdescdiv = "." + url.target + ' td:nth-child(3)';

                                //alert(targetreleasediv);
                                //alert(targetdescdiv);

                                $(targetreleasediv).html(sData.env.v);
                                $(targetdescdiv).html(sData.env.desc);
                            },
                            fail: function(jqXHR, textStatus, errorThrown){
                                alert("Error " + jqXHR.responseText+ " error thrown is " + errorThrown + " status is " + textStatus);
                                var targetreleasediv = "." + url.target + ' td:nth-child(2)';
                                var targetdescdiv = "." + url.target + ' td:nth-child(3)';

                                //$(targetreleasediv).html("server is currently down");
                                //$(targetdescdiv).html("server is currently down");

                            }
                        });


                });


            });

    });

这是带有 url 的 json 数组:

{
   "env":{
      "urls":[
         {
            "path":"http://server.domain.com/server/webcontent/js/evt2_server1.js",
            "target":"env2-server"
         },
         {
            "path":"http://server.domain.com/server/webcontent/js/evt2_server2.js",
            "target":"env2-server2"
         }
      ]
   }
}

这是请求返回的json字符串

{"env":{"v":"Tag_12345","desc":"Test of purpose"}}

现在,当我提交页面时,我会收到 json ajax 请求,但不会调用 done 或 fail 方法。

【问题讨论】:

  • 目前还不清楚是什么问题。您是否尝试过使用一个回调函数并看到需要帮助解决的问题?如果是,请描述您希望帮助解决的问题。否则,我们需要查看您的代码并更好地描述问题所在才能知道如何提供帮助。
  • @jfriend00 我添加了上面的代码。基本上我循环遍历 json 数组获取 url,然后触发跨域 jsonp 请求。我有一个奇怪的行为。我刷新页面 10 次,它有时有效,有时无效。当 json 数组只有 1 个 url 时,它也可以 100% 工作。当我添加 2 时,它变得很奇怪。此外,如果请求失败,它们都会失败。有什么想法吗?

标签: jquery ajax cross-domain jsonp


【解决方案1】:

$.each$().eachfor 循环的不同之处在于,对于它循环的每个项目,在其上运行的函数都在它自己的范围内。您应该能够在每个 jsonp 调用中简单地使用相同的回调而无需担心。

【讨论】:

  • 您发布的代码基本上是我作为示例提供的代码,但是,我会使用.done().fail() 而不是已贬值的.success().error()。然而,这种变化不应该产生任何影响。 “它变得很奇怪”是什么意思?
  • 出于某种原因,如果我刷新页面 10 次,它可能会工作一次。然后,如果我故意破坏其中一个 url,当我期望一个成功而另一个命中错误时,两者都将始终失败。如果我删除 1 个 url,那么只有 1 个。它 100% 的时间都有效。很奇怪。
【解决方案2】:

我发现您的代码存在多个问题:

  1. reqQueue 不应该是一个数组。你使用它的方式,它应该是一个对象。一旦您在此处更改/修复第 2) 项,我认为您甚至不需要 reqQueue。
  2. 在进行 ajax 调用后,您正在定义 .success.error 处理程序。它们应该在 ajax 调用之前定义。我建议在 ajax 数据结构中定义它们,以便在最初创建时将它们直接传递给 ajax 函数。
  3. 除非您尝试解决某个特定问题,否则我认为您应该从 ajax 参数中删除 jsonpCallback: 'jsonCallback', 选项。根据 jQuery ajax 文档,最好让 jQuery 管理该函数名称。

【讨论】:

  • 我会试试这些。这是第3步的问题。我有一个静态 javascrip t 文件,它被硬编码为 json 字符串,所以当我让 jquery 执行该功能时,我正在加载的 javascript 文件无法像普通 jsonp 服务器那样附加 jsonp 函数。
  • 我刚刚更新了代码。我按照您的建议做了,但是现在获取了 ajax 调用,但它没有调用 done 或 fail 方法。建议?
  • 在 ajax 数据结构中定义处理程序时,使用success:error:,而不是done:fail:。请参阅ajax doc 了解更多信息。
  • 所以当我改变它时,它会给出一个解析错误。所以我将 jsonp 更改为 json 并且它在本地工作。但是,当我部署它时,它将运行 subdomain.site.com 并向 subdomain2.site.com 和 subdomain3.site.com 发出请求。那些被认为是跨域的?如果是这样,那么我需要再次制作这个 jsonp。我相信它会给 jsonp 带来解析错误,因为在我删除 jsonCallback 后,我的 json javascript 文件是用 json 字符串硬编码的。因为它们是静态 js 文件,所以它们不能与 jsonp 一起使用,除非我特别告诉它要调用的回调函数。
  • 好的,当你把jsonpCallback: 'jsonCallback'放回去时会发生什么?
猜你喜欢
  • 2015-03-11
  • 1970-01-01
  • 2013-12-07
  • 2017-12-30
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 2013-10-17
  • 2015-06-22
相关资源
最近更新 更多