0

我正在尝试将 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 插件使用延迟,那就太好了。

谢谢你们。

弗拉维亚

4

1 回答 1

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
    ...
  })
;
于 2012-03-09T13:35:47.783 回答