将success/jsonpCallback与ajax请求一起使用

将success/jsonpCallback与ajax请求一起使用,ajax,callback,jsonp,odata,Ajax,Callback,Jsonp,Odata,我正在使用他们的ODataAPI为Netflix开发一个应用程序。我已经介绍了如何查询ODataAPI。在其中,他使用了以下代码: $.ajax({ dataType: "jsonp", url: query, jsonpCallback: "callback", success: callback }); 在我的应用程序中,我需要使用OData的分页链接来检索完整的列表。我的代码如下: // create url and handle ajax call to Ne

我正在使用他们的ODataAPI为Netflix开发一个应用程序。我已经介绍了如何查询ODataAPI。在其中,他使用了以下代码:

$.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();
    }
  }

然而,当这个程序运行时,我不断得到一个
parserror
。回调函数似乎被调用了两次。如果删除
success:callback
行,则应用程序工作正常。我的问题是:离开ajax调用的
success
代码行是否有问题?或者为什么需要同时包含
jsonpCallback
success
行?我问这个问题主要是出于好奇,因为应用程序似乎在没有两个回调行的情况下运行良好。

不要定义
回调,因为jQuery为您创建了该函数。下面是一个例子:


callback=?
基本上要求jQuery处理所有JSONP返回。

基于您的代码试图做什么,我不确定您为什么在
$.ajax
调用中同时指定
jsonpCallback
success
。我建议您只指定
success
,以便处理数据和处理分页。让jQuery定义jsonp回调的名称

本质上,jsonp回调所做的是从WCF数据服务接收有效负载,然后将其交给成功处理程序。如果您想在数据被
success
处理程序处理之前对其进行一些缓存或其他预处理,那么您可以使用
jsonpCallback
。我不知道在这种情况下,为什么要指定与
jsonpCallback
success
处理程序相同的函数。(我简要浏览了你链接到的斯蒂芬的文章,我不知道他为什么这么做。)

下面是一个对WCF数据服务的jsonp调用示例,我在演示和对话中使用了该服务(已经使用了一段时间)。我使用
JSONPSupportBehaviorAttribute
在我的WCF数据服务中启用JSONP(不确定您是否正在使用它)

但是在我的示例代码中,我没有指定
jsonpCallback
名称;我只指定了
jsonp
querystring参数(必须是
$callback
而不是默认的
callback
),但我让jQuery命名jsonp回调函数

我的
success
处理程序只调用一次,一切正常。因此,我的建议是忘掉
jsonpCallback
,让你的
成功
处理程序就位,我认为事情应该开始变得更好

我希望这有帮助。如果您有后续问题,请告诉我。祝你好运

$.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>");
        });
    }
});
$.ajax({
网址:'http://server:25812/Services/AgileWays.Baseball.Service.svc/Teams?$format=json&$filter=yearID eq 1882',
键入:“GET”,
数据类型:“jsonp”,
cache:false,
jsonp:“$callback”,
错误:函数(x,t,r){alert(x.response.message);},
成功:功能(数据){
$。每个(数据d.结果、函数(i、val){
$(“#结果”).append(“+val.name+”);
});
}
});

不幸的是,这仍然会抛出错误“parsererror:DoesntExist未调用”。我将继续研究这个主题,但据我所知,success和jsonpCallback调用回调函数并没有什么好处。我想我可以修改错误处理来忽略“没有调用DoesntExist”,但这仍然留下了我最初的问题,为什么两者都有。好吧,我不是很清楚。看看这个:除了成功之外,没有错误,也没有定义回调。就像原始代码一样。。对于单个ajax调用。当进行后续ajax调用以检索其余结果时,就会出现错误。我不知道是否抛出了错误,因为请求发生得太快,而ajax调用仍在等待服务器对以前请求的响应。但是错误并不是真正的问题,我只是想知道将success和jsonpCallback同时用于回调函数的原因。
$.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>");
        });
    }
});