【发布时间】: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