Jquery-jsonp插件和延迟对象,而不是推迟

时间:2011-10-28 09:47:57

标签: jquery error-handling jsonp jquery-deferred

我正在尝试将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和Web的深度,并阅读了插件页面上的所有内容。我尝试了几种方法,但到目前为止还没有任何方法(就好像延迟甚至不存在)。 我的假设是延迟不适用于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插件,那将是很好的知道。

谢谢大家。

Flavia的

1 个答案:

答案 0 :(得分: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
    ...
  })
;