jQuery.ajax():无法访问两个返回的json对象(jsonp)

时间:2013-11-15 11:41:34

标签: javascript json jquery jsonp

如果这是一个重复的问题,我将很乐意重定向到答案:)。

某些背景:

我有一个处理JSONP请求的小对象。

直到最近,我才使用像这样的纯JavaScript处理请求......

this.fetchJsonp = function(){

     //the 'request' variable holds the URL and parameters for the request.

     var request = this.request;

     //creates a script element

     var jsonpCall = document.createElement('script');

     //gets jsonp request
     jsonpCall.src = request;

     //adds script to DOM, which goes on to request the JSONP from the service.
     document.getElementsByTagName('head')[0].appendChild(jsonpCall);

};

执行此代码后,将调用回调函数并将JSONP对象传递给它。由于设置了服务的方式,服务以这种格式向我发送了两个JSONP对象:

callbackWrapperFunc({"arrayName":[{item1:"hello",item2:"world"}]}, {anotherImportantItem:"!"});

我可以将这些对象传递给回调函数,因为......

this.myCallBackFunction(firstObject, secondObject){

   //manipulate data here 

}

问题:

我已经改变了我的方法,现在我正在使用jQuery来处理JSONP请求,因为它允许我更容易地处理错误。

//snippet of my jQuery ajax call:

jQuery.ajax({
       url: this.request,
       type: 'get',
       dataType: 'jsonp',

       success: function(firstObject, secondObject) {

                      //manipulate data here

                }

       });

我知道传递给'success'的参数与原始代码的工作方式不同,因为jQuery ajax对象将第二个和第三个参数作为textStatus返回(详细说明调用是成功还是失败)和jqXHR对象。

使我能够访问数据的第一个参数使我能够访问第一个JSON对象而不是第二个JSON对象。我似乎无法找到一种方法来访问第二个对象(我也尝试'循环'通过对象,但无济于事:也许我做错了?)。

知道我这可能非常简单!任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

为什么不在JavaScript中使用PageMethod调用并构造要发送回的值对列表?

答案 1 :(得分:0)

我设法找到了解决方案。感谢@Matt的灵感。

<强>追赶...

这确实看起来像jQuery中的限制,正如所指出的那样,接受一个JSON对象到回调函数中,似乎是一个预期的规范。

如果您在我的位置,并希望通过Web服务接受一个或多个JSON对象进入回调,我已经开发了一个小解决方案:

解决方案

我不再使用jQuery,我正在使用我从Web服务调用JSON对象的原始方式。

在我的JSON处理程序对象中,我编写了一个自定义回调函数,它接受多个JSON对象并将它们处理成一个对象以方便使用。

    this.processJSON = function(){

        //places any number of arguments (json objects) from the service into one JSON object.

        var data = {};

        for(var i = 0; i <= arguments.length; i++){

           data[i] = arguments[i];

        };

        that.callback(data); //sends data to user designated callback

    };

此函数只读取将多少arguments(在本例中为JSON对象)放入函数的arguments数组中,并将它们全部处理到一个data对象中。

然后您可以将它发送到您希望的任何地方。

请注意,调用此函数进程的回调函数必须是全局的,以便在正确的范围内识别它。例如,我通过将此函数放在我的JSON处理对象中来实现它:

    window.jsonCallback = function(){

        //this function is executed if the script is successful
        that.call = true;
        that.processJSON(arguments);

    };

示例Web服务调用:

www.myservice.com/service?value="something"&callback=jsonCallback

that指的是JSONobject的范围,因此它知道在哪里查找被调用的函数。 call变量与错误处理有关(我也找到了没有jQuery的解决方案),但不在本答案的范围内。

我希望这有助于任何希望处理从Web服务传递到其应用程序的多个JSON对象的人。