【问题标题】:Jquery-jsonp plugin and deferred objects, not deferringJquery-jsonp 插件和延迟对象,不延迟
【发布时间】:2011-12-17 04:15:57
【问题描述】:

我正在尝试将 jQuery-jsonp 插件与 jQuery Deferred Objects 一起使用,但到目前为止我没有运气。

目标是调用 API、检索数据并详细说明它们。由于我使用相同的调用来检索和详细说明用于不同目的的不同数据集,因此我以这种方式构建我的代码以避免在每个详细说明函数中显式重复相同的 API 调用:

function callAPI(){
  return $getJSON(url);
}

function doStuff1(){
  $.when(callAPI)
  .then(function(data){
    //get the data and elaborate them for purpose #1
  })
}

function doStuff2(){
  $.when(callAPI)
  .then(function(data){
    //get a different set of data from same API
    // and elaborate them for purpose #2
  })
}

问题是,我尝试了相同的方法,用 Julian Aubourg 的插件 (http://code.google.com/p/jquery-jsonp/) 中的 $.jsonp() 替换 $.getJSON(),但延迟不起作用。

我对此有一些限制,无法更改:

*API 调用必须使用 JSONP。

*我必须能够检测到错误(无论哪种),因此使用 jQuery-jsonp 插件,这是我目前找到的唯一解决方案。

我研究了 jQuery Deferred Object,搜索了 jQuery 论坛、Stackoverflow 和网络深度,并阅读了插件页面上的所有内容。我尝试了几种方法,但到目前为止都没有奏效(就好像 deferred 甚至不存在一样)。 我的假设是延迟不适用于 jquery-jsonp 插件,因为它的结构(这是允许它捕获错误的原因),并且因为 $.jsonp 本身不像 $.ajax 那样是延迟的,但我绝不是专家,所以我需要这个出色社区的一些建议。

我找到了一个对我有用的解决方案,就是将一个函数作为参数传递给 callAPI 函数,这样在成功时它可以执行我需要的操作,而无需重复自己。

所以我的 callAPI 函数会变成这样:

function callAPI(func){
 $.jsonp({
   "url": url,
   "success": function(data) {
     func();
   },
   "error": function(d,msg) {
    //show error message
   }
 })
}

callAPI(doStuff1);
//or
callAPI(doStuff2);

但是,由于错误管理的必要性在开发阶段很晚才出现,而我作为新手并没有早点考虑,这意味着要重写一大堆代码。因此,如果有人设法将延迟与 jquery-jsonp 插件一起使用,那就太好了。

谢谢大家。

弗拉维亚

【问题讨论】:

    标签: jquery error-handling jsonp jquery-deferred


    【解决方案1】:

    我想这就是你想要的。您必须将 jQuery-jsonp 的内部 api 映射到延迟对象上的调用方法。

    function callAPI(url){
      return $.Deferred(function(dfd) {
        $.jsonp({
          url: url
          ,success: dfd.resolve
          ,error: dfd.reject
          ,complete: dfd.always
        });
      }).promise();
    }
    

    那么你应该可以使用

    $.when(callAPI('url #1'), callAPI('url #2'))
      .done(function(response1, response2) {
        // each response will be [ json , STR_SUCCESS ] based on Jquery-jsonp's API
        var json1 = response1[0];
        ...
      })
      .error(function(error1, error2) {
        // each response will be [ xOptions , type ] based on Jquery-jsonp's API
        ...
      })
    ;
    

    【讨论】:

    • 谢谢! (对于非常延迟接受的答案感到抱歉。)最后,我们也是 api 提供者,我的后端同事决定 API 必须返回 200,即使出现错误,也详细说明错误的响应。绝大多数错误是由于空项目或缺少参数造成的,因此我们还有一种方法可以确定 API 爆炸的确切原因,并且在当时是有意义的。但最终直接到地狱的错误(500、400 或 404)由 .error() 案例处理。 (但我们完全重构了这个东西,所以我们能够做出更好的选择:))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多