我正在使用其OData API为Netflix开发应用程序。我一直关注Stephen Walther的博客条目,了解如何查询OData API。在其中,他使用以下代码:
$.ajax({ dataType: "jsonp", url: query, jsonpCallback: "callback", success: callback });
在我的应用程序中,我需要使用OData的分页链接来检索完整列表。我的代码如下:
// create url and handle ajax call to Netflix function getTitles() { query = "http://odata.netflix.com/v2/Catalog" // netflix odata base url + "/Genres('Television')" // select Genre + "/Titles" // top-level resource + "?$select=NetflixApiId,Name,BoxArt,Synopsis,ReleaseYear,AverageRating,Series" // choose fields + "&$orderby=Name" // Sort results by name + "&$filter=Instant/Available eq true" // filter by instant view + " and Type eq 'Season'" // select only seasons + "&$expand=Series" // include series data + "&$callback=callback" // specify name of callback function + "&$format=json"; // json request $.ajax({ dataType: "jsonp", url: query, jsonpCallback: "callback", success: callback, error: function(XHR, textStatus, errorThrown){ alert(textStatus + ":" + errorThrown); } }); } // create seasons array and and repeat ajax call until all results are returned function callback(result) { seasons = seasons.concat(result["d"]["results"]); if (typeof result["d"]["__next"] != 'undefined') { var urlJSONP = result["d"]["__next"] + "&$callback=callback&$format=json"; $.ajax({ dataType: "jsonp", url: urlJSONP, jsonpCallback: "callback", success: callback, error: function(XHR, textStatus, errorThrown){ alert(textStatus + ":" + errorThrown); } }); } else { processResults(); } }
但是,当运行时,我会不断收到parserError。似乎回调函数被调用了两次。如果我删除该success: callback行,该应用程序将正常运行。我的问题是:离开successajax调用的代码行是否有问题?或为什么必须同时包含jsonpCallback和success行?我主要是出于好奇而问这个问题,因为在没有两个回调行的情况下,该应用程序似乎都能正常运行。
parserError
success: callback
success
jsonpCallback
根据您的代码尝试执行的操作,我不确定为什么要在通话中同时指定jsonpCallback和。我建议您仅指定为了处理数据和处理分页。让jQuery定义jsonp回调的名称。success``$.ajax``success
success``$.ajax``success
实质上,jsonp回调所做的是从WCF数据服务接收有效负载,然后将其传递给成功处理程序。它看起来像您可以使用jsonpCallback,如果你想要做一些缓存或数据的其他一些预处理,然后才会慢慢由你处理success的处理程序。我不确定在这种情况下为什么要指定与您的jsonpCallback和success处理程序相同的功能。(我简要浏览了您链接到的斯蒂芬的文章,这不是他这样做的原因。)
下面是对WCF数据服务的jsonp调用示例,我在演示和演讲中使用了(并且已经使用了一段时间)。我使用JSONPSupportBehaviorAttribute来在WCF数据服务中启用JSONP(不确定这是否是您正在使用的)。
JSONPSupportBehaviorAttribute
但是在示例代码中,我没有指定jsonpCallback名称;我只是指定jsonpquerystring参数(必须是$callback而不是默认值callback),但是我让jQuery命名为jsonp回调函数。
jsonp
$callback
callback
我的success处理程序被调用一次,一切正常。所以我的建议是忘记jsonpCallback,让您的success处理程序保持在原位,我认为事情应该会开始更好地工作。
我希望这有帮助。如果您有其他疑问,请告诉我。祝好运!
$.ajax({ url: 'http://server:25812/Services/AgileWays.Baseball.Service.svc/Teams?$format=json&$filter=yearID eq 1882', type: 'GET', dataType: 'jsonp', cache: false, jsonp: '$callback', error: function (x, t, r) { alert(x.response.message); }, success: function (data) { $.each(data.d.results, function (i, val) { $("#results").append("<div>" + val.name + "</div>"); }); } });