【发布时间】:2014-04-06 20:36:33
【问题描述】:
我想我会被困在编写一个凌乱的调度函数,但我想我会检查 S.O.社区首先看看是否有人提出了更简单的解决方案。
感谢世界银行有一个开放的 API,但他们有一些实施问题。第一个问题是他们的服务器没有实现 CORS Access-Control-Allow-Origin: *,所以这意味着 JSONP 而不是 JSON。这不是问题,只是它们不保留回调函数的大小写!举一个具体的例子,我在我的代码中提出以下要求:
var deferredRegionsRequest = $.getJSON(
"http://api.worldbank.org/regions/?prefix=?",
{format: "jsonp"}
);
(是的,他们使用参数prefix 而不是传统的callback。)
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...) 的所有小写版本,并且调用原始版本不执行任何操作。 hack 商数太高了,我头晕目眩,但我已经证实这确实有效:
$.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 ajax callback jsonp