Javascript ajax():Can';t访问两个返回的json对象(jsonp)
如果这是一个重复的问题,我将很高兴地被重定向到一个答案:) 一些背景: 我有一个处理JSONP请求的小对象 直到最近,我还在使用纯JavaScript处理请求,就像这样Javascript ajax():Can';t访问两个返回的json对象(jsonp),javascript,json,jquery,jsonp,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
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对象,而不是第二个。我似乎找不到访问第二个对象的方法(我也尝试过在对象之间“循环”,但没有效果:也许我做错了?)
了解我可能真的很简单!任何帮助都将不胜感激 为什么不在JavaScript中使用PageMethod调用并构造一个要发回的值对列表呢?我已经想出了一个解决方案。感谢@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
};
web服务调用示例:
www.myservice.com/service?value=“something”&callback=jsonCallback
指的是JSONobject的作用域,因此它知道在哪里查找正在调用的函数。call
变量与错误处理有关(我也找到了一个不使用jQuery的解决方案),但不在这个答案的范围之内
我希望这能帮助那些希望处理从web服务传递到应用程序中的多个JSON对象的人。如何在服务器端脚本中发送两个JSON对象?!!?!为什么不在一个数组中发送两个对象?像这样:[{..},{..}]虽然您所做的是完全可能的,但由于某种原因,JSONP已经发展到这样一种程度:期望/假设(没有技术限制!)只向回调函数传递一个参数。因此,如果jQueryJustPlain不能处理这个问题,我不会感到惊讶(没有时间检查源代码);您可能需要考虑@ MeHeFiBar的方法来传递包含两个对象的单个数组,或者传递一个父对象,其中两个对象都是属性。这就是我自己所害怕的。我将不得不研究@Mohebifar的建议。谢谢你们的快速响应。我建议继续做你们已经在做的事情,jQuery无论如何都不能正确处理jsonp错误。从$.ajax
文档中查找错误:“注意:跨域脚本和跨域JSONP请求不调用此处理程序。”@Kevin B:Hey here。我也一直在想这个。我在jQuery中使用ajax对象的原因是,尽管它不能跨域处理错误,“success”功能仍然会给我的代码一个提示,告诉我它是否已经收到了数据,或者不启动我自己的错误处理过程。我将尝试提出一个纯JS的替代方案。我相信PageMethods是ASP.NET独有的,我不使用它。不过,谢谢你的建议。
window.jsonCallback = function(){
//this function is executed if the script is successful
that.call = true;
that.processJSON(arguments);
};