多个jquery跨域JSONP请求,每个请求具有相同的回调

时间:2011-10-25 21:33:36

标签: jquery ajax cross-domain jsonp

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

我正在尝试构建一个url数组来循环,我想为每个url发出一个jsonp请求。对于每个响应,我想获取该json对象,然后将数据写入页面的一部分。我不在乎它是什么顺序。如果我使用$ .each函数,我不需要考虑范围?因为我只定义了一个回调函数,并且我想覆盖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");

                            }
                        });


                });


            });

    });

这是带有urls的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方法。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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