2013-11-15 55 views
0

如果这是一个重复的问题,我会很乐意被重定向到答案:)。jQuery.ajax():无法访问两个返回的json对象(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对象传递给它。由于被称为服务设置方式,服务发送我在这个格式2个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 

       } 

     }); 

我知道,传递到“成功”的参数不会以同样的方式为我的原代码,因为jQuery的Ajax对象返回第二个和第三个参数作为textStatus(详细介绍了呼叫是否是成功的工作或失败)和jqXHR对象。

让我访问数据的第一个参数只让我可以访问第一个JSON对象,而不是第二个参数。我似乎无法找到访问第二个对象的方法(我也尝试通过对象“循环”但无济于事:也许我做错了?)。

这可能是非常简单的了解我!任何帮助将不胜感激!

+0

如何在服务器端脚本中发送两个JSON对象?!!?你为什么不在数组中发送两个对象?像这样:[{..},{..}] – Mohebifar

+1

尽管你正在做的事情是完全可能的,由于某种原因,JSONP已经发展成预期/假设(通过没有技术限制!),只有单个参数将被传递给回调函数。正因为如此,我不会惊讶(没有时间检查源代码),如果jQuery只是普通*不处理这个;你可能不得不考虑@ Mohebifar传递一个包含两个对象的单个数组的方法,或者传递一个父对象,其中的两个对象都是属性。 – Matt

+0

嗨,大家好。这是我害怕自己。我将不得不考虑@ Mohebifar的建议。感谢您的快速回复。 – Mark

回答

0

我设法想出了一个解决方案。感谢@Matt的灵感。

赶超...

这的确看起来像jQuery的限制,正如指出的那样,接受一个JSON对象为回调函数,貌似,预期的常态。

如果你在我的位置上,并想通过网络服务来接受一个或多个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的解决方案),但不在此答案的范围内。

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

0

为什么不在JavaScript中使用PageMethod调用并构造一个值对列表来发回?

+0

你好:)。我相信PageMethods对ASP.NET来说是独一无二的,而我并没有使用它。不过,谢谢你的建议。 – Mark