我在客户端使用JSONP使用WCF服务从服务器获取数据,该服务可以使用HTTP GET返回结果(它获得'callback'参数,这是'函数名'并返回回调({data}),你知道...... JSONP)。
一切正常,但是如果我在其中一个服务的操作上启用缓存(使用'AspNetCacheProfile') - 那么出了点问题,我不确定是什么......
我获得JSONP的方法是使用我之前从问题中获取的函数(http://stackoverflow.com/questions/2499567/how-to-make-a-json-call -to-A-URL)
function getJSONP(url, success) {
var ud = 'fc_' + + Math.floor(Math.random()*1000000),
script = document.createElement('script'),
head = document.getElementsByTagName('head')[0]
|| document.documentElement;
window[ud] = function(data) {
head.removeChild(script);
success && success(data);
};
script.src = url.replace('callback=?', 'callback=' + ud);
head.appendChild(script);
}
这会创建一个随机id('fc_xxxx')然后将其作为一个函数分配给window对象,然后将其用作注入文档的动态javascript的url的'callback'参数,然后'ud'函数运行,删除脚本并使用接收的数据调用'success'回调函数。
在服务的正常非缓存操作中使用它时,通常需要大约200ms才能获得响应,并且它可以正常工作。
缓存的响应大约需要10毫秒 -
并且我收到'fc_XXXXX'函数未定义的错误。
就好像响应“太快”了。
我也尝试过使用 jQuery.getJSON() - 而且回调也不会触发。
在所有情况下,当我查看Firebug中的网络流量时 - 我可以看到GET请求,我可以看到正确的数据实际上已经返回。
有没有人知道我如何才能使缓存的响应正常工作......?
答案 0 :(得分:0)
我明白了!响应函数的名称在每次调用时都是不同的(在我的手动jsonp实现和jQuery的实现上)。
该函数的名称是服务器响应的一部分(因为这是jsonp如何工作的一部分......)。
因此,如果响应是缓存响应 - 它实际上将返回函数的旧名称(在客户端的上下文中将不再存在)。
所以我只需要在这种情况下给回调函数一个常量名称,它应该没问题。 :)