【问题标题】:Use of success / jsonpCallback with ajax request使用成功 / jsonpCallback 与 ajax 请求
【发布时间】:2011-11-02 07:23:17
【问题描述】:

我正在使用他们的 OData API 为 Netflix 开发一个应用程序。我关注了Stephen Walther's blog entry 如何查询 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 行,应用程序工作正常。我的问题是:从 ajax 调用中留下 success 代码行有问题吗?或者为什么需要同时包含jsonpCallbacksuccess 行?我主要是出于好奇而问这个问题,因为如果没有两条回调线,应用程序似乎可以正常工作。

【问题讨论】:

    标签: ajax callback jsonp odata


    【解决方案1】:

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

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

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

    但在我的示例代码中,我没有指定 jsonpCallback 名称;我只是指定了jsonp查询字符串参数(必须是$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>");
            });
        }
    });
    

    【讨论】:

      【解决方案2】:

      不要定义callback,因为jQuery 会为您创建该函数。这是一个例子,jsFiddle

      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=?" // specify name of callback function
          + "&$format=json"; // json request
          $.ajax({
            dataType: "jsonp",
            url: query,
            success: callback,
            error: function(XHR, textStatus, errorThrown){
              alert(textStatus + ":" + errorThrown);
            } 
          });
        }
      

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

      【讨论】:

      • 不幸的是,这仍然会抛出错误“parsererror:不调用不存在”。我将继续研究这个主题,但据我所知,同时成功和 jsonpCallback 调用回调函数并没有什么好处。我想我可以修改错误处理以忽略“未调用 DoesntExist”,但这仍然给我留下了最初的问题,即为什么两者都有。
      • 好吧,我不是很清楚。看这个:jsfiddle.net/e8yYB/1 除了成功之外没有定义错误和回调。
      • 好的,这适用于第一个 ajax 调用。与原始代码一样。对于单个 ajax 调用。当进行后续的 ajax 调用以检索其余结果时,会发生错误。我不知道是否会抛出错误,因为请求发生得如此之快,并且 ajax 调用仍在等待服务器对先前请求的响应。但是错误并不是真正的问题,我只是好奇同时使用success和jsonpCallback作为回调函数的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 2019-01-22
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多