js中异步请求的问题
通过.ajax()发送三个请求,url地址是关键,用到mootools里的Hash.如果请求的url不在hash里,则将发请求,得到data,将(url,data)存到hash里,如果url存在hash的话就通过url在hash取data,不用发请求.
var CommonCascade = new Class({
loadData: function() {
var self = this;
var path = self.options.path; //传进来的url
CommonCascade.templHash = CommonCascade.templHash || new Hash();
eventListener.addEvent('loaded', function() {
var data = CommonCascade.templHash.get(self.options.path);
console.log(data);
});
// if (!CommonCascade.loading) {
if (CommonCascade.templHash.has(path)) {
var tempResult = CommonCascade.templHash.get(path);
self.createOptions(tempResult, jQuery(self.options.firstSelect), '1');
self.bindEvent(tempResult);
} else {
jQuery.ajax({
url: this.options.path,
dataType: 'json',
beforeSend: function() {
CommonCascade.loading = true;
},
success: function(data) {
if (data.data) {
data = data.data;
}
CommonCascade.templHash.set(path, data); eventListener.fireEvent('loaded');
},
complete: function() {
CommonCascade.loading = false;
}
});
}
// }
},
});
这里是一个类,如果实例化三个这种情况.这里if被注释了,有两个url是相同的,本来发两次请求,这个发了三次请求.如果加上if只会请求一次,hash里值存了一个.
------解决方案-------------------- CommonCascade.loading = true; ,CommonCascade 是全局的变更,只能保存一个状态
所以加上判断就变成1次了
改成,CommonCascade 加上 urls 对象以url为KEY
CommonCascade.urls[url].loading //这样状态就独立开来了
-------------
你试一下,ajax直接开启缓存是不是也就实现你要的功能了
------解决方案-------------------- new Class({
urls:{}, //这加个urls 试试
loadData: function() {
------解决方案--------------------