我想我会被困在写一个混乱的调度函数,但认为我会检查S.O.社区首先看看是否有人提出了一个更简单的解决方案。修改jQuery jsonp回调函数?
祝福世界银行有一个开放的API,但他们有一些实施问题。首先问题是他们的服务器没有实现CORS Access-Control-Allow-Origin: *
,所以这意味着JSONP而不是JSON。这不会是一个问题,除非他们不要保存回调函数的情况下!举一个具体的例子,我做我的代码如下要求:(是的,他们所使用的参数prefix
代替传统callback
的)
var deferredRegionsRequest = $.getJSON(
"http://api.worldbank.org/regions/?prefix=?",
{format: "jsonp"}
);
jQuery的尽职尽责地创建一个随机的回调函数问题AJAX请求为:
http://api.worldbank.org/regions/?prefix=jQuery18308848262811079621_1393981029347&format=jsonp&_=1393981029990
注意,回调函数有一个大写的Q
。
然而,世界银行的回应已将该回调重新命名为全部小写!
jquery18308848262811079621_1393981029347([
{ "page": "1", "pages": "1", "per_page": "50", "total": "32" },
[ {
"id": "",
"code": "AFR",
"name": "Africa"
}, {
...
很明显,这是行不通的。如果我只是提出一个请求,那么提供我自己的回调函数并使用$.ajax()
的jsonpCallback
参数不会太痛苦。不幸的是,我需要遍历并遍历他们的REST API,所以我会做几十个(并行)API调用。我已经检查了一个自定义回调函数,并且this
被设置为全局window
对象,所以似乎没有任何明显的方法让单个回调函数来管理多个响应。看起来我可能会陷入一个凌乱的自定义调度程序实现,我很想避免这种实现。
到目前为止,我唯一的选择是定义一个beforeSend
回调函数,它使用完全填充的URL,解析它以查找回调函数(jQuery...
),动态创建一个全部为小写形式的新回调函数(jquery...
),并且通过调用原始文件不做任何事情。黑客商是如此之高,我的头旋转,但我已经验证了这样做的工作:
$.ajaxSetup({
beforeSend: function(xhr, settings) {
var prefix = settings.url.match(/prefix=(.*?)&/);
if (prefix.length > 1) {
var callback = prefix[1];
if (callback !== callback.toLowerCase()) {
window[callback.toLowerCase()] =
new Function("response", callback + "(response)");
}
}
}
});
我真的希望我失去了一些东西很简单,有人很善良会指出来给我。
感谢您的鼓励;这让我感觉好一点。但需要注意的一点是,jQuery实际上并没有定义jsonp回调('jQuery ...'),直到**调用'beforeSend'之后的某个点**。所以只是创建全局变量将不起作用。但是,如果这是我留下的,创建一个动态函数不会太难。 –
@StephenThomas - 啊,好的。稍微创建小写回调的工作稍微多一些,但听起来你知道该怎么做。 – jfriend00
顺便说一句,如果因为没有其他原因,感谢您阅读我冗长的问题,我会为此答复投票。 –