日期:2014-05-16  浏览次数:20315 次

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里值存了一个.
JavaScript asynchronous HASH

------解决方案--------------------
  CommonCascade.loading = true; ,CommonCascade 是全局的变更,只能保存一个状态
  所以加上判断就变成1次了
 改成,CommonCascade 加上 urls 对象以url为KEY
   CommonCascade.urls[url].loading   //这样状态就独立开来了
-------------
你试一下,ajax直接开启缓存是不是也就实现你要的功能了
------解决方案--------------------
  new Class({
  urls:{}, //这加个urls 试试 
loadData: function() {
------解决方案--------------------