使用带有ajax请求的success/jsonpCallback

And*_*ndy 6 ajax jsonp callback odata

我正在使用他们的OData API为Netflix开发一个应用程序.我已经关注了Stephen Walther关于如何查询OData API 的博客文章.在其中,他使用以下代码:

$.ajax({
   dataType: "jsonp",
   url: query,
   jsonpCallback: "callback",
   success: callback
}); 
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我需要使用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();
    }
  }
Run Code Online (Sandbox Code Playgroud)

然而,当这个运行时我会继续得到一个parserError.似乎回调函数被调用两次.如果我删除该success: callback行,该应用程序工作正常.我的问题是:success从ajax调用中删除代码行是否有问题?或者为什么有必要包括jsonpCallbacksuccess线?我主要是出于好奇而问这个问题,因为应用程序似乎在没有回调线的情况下工作正常.

Dav*_*ter 4

根据您的代码尝试执行的操作,我不确定您为什么在调用中同时指定jsonpCallback和。我建议您只指定以便处理您的数据并处理您的分页。让 jQuery 定义 jsonp 回调的名称。success$.ajaxsuccess

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

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

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

我的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>");
        });
    }
});
Run Code Online (Sandbox Code Playgroud)