var QueuedHandler = function(){
this.queue = [];
this.requestInProgress = false;
this.retryDelay = 5;
};
QueuedHandler.prototype = {
request:function(method,url,callback,postVars,override){
if(this.requestInProgress && !override){
this.queue.push({
method:method,
url:url,
callback:callback,
postVars:postVars
});
}else{
this.requestInProgress = true;
var xhr = this.createXhrObject();
var that = this;
xhr.onreadystatechange = function(){
if(xhr.readyState !== 4) return;
if(xhr.status === 200){
callback.success(xhr.responseText,xhr.responseXML);
that.advanceQueue();
}else{
callback.failure(xhr.status);
setTimeout(function(){
that.request(method,url,callback,postVars);
},that.retryDelay * 1000);
}
};
xhr.open(method,url,true);
if(method!=='POST')postVars = null;
xhr.send(postVars);
}
},
createXhrObject:function(){
var methods = [
function(){return new XMLHttpRequest();},
function(){return new ActiveXObject('Msxml2.XMLHTTP');},
function(){return new ActiveXObject('Microsoft.XMLHTTP');},
];
for(var i=0,len=methods.length;i<len;i++){
try{
methods[i]();
}catch(e){
continue;
}
this.createXhrObject = methods[i];
return methods[i]();
}
throw new Error('SimpleHandler: Could not create an XHR object.');
},
advanceQueue:function(){
if(this.queue.length === 0){
this.requestInProgress = false;
return;
}
var req = this.queue.shift();
this.request(req.method,req.url,req.callback,req.postVars,true);
}
};
用以下方法调用,你会发现,除第一个请求外,其它的请求都会在上一个请求完全完成后才执行的。
var myHandler = new QueuedHandler();
var callback = {
success:function(reponseText){console.log('Success');},
failure:function(statusCode){console.log('Failure');}
};
myHandler.request('GET','feedProxy.php?feed=http://julabs.me/blog/feed/rss/',callback);
myHandler.request('GET','feedProxy.php?feed=http://julabs.me/blog/feed/rss/',callback);
myHandler.request('GET','feedProxy.php?feed=http://julabs.me/blog/feed/rss/',callback);
myHandler.request('GET','feedProxy.php?feed=http://julabs.me/blog/feed/rss/',callback);
this.queue = [];
this.requestInProgress = false;
this.retryDelay = 5;
};
QueuedHandler.prototype = {
request:function(method,url,callback,postVars,override){
if(this.requestInProgress && !override){
this.queue.push({
method:method,
url:url,
callback:callback,
postVars:postVars
});
}else{
this.requestInProgress = true;
var xhr = this.createXhrObject();
var that = this;
xhr.onreadystatechange = function(){
if(xhr.readyState !== 4) return;
if(xhr.status === 200){
callback.success(xhr.responseText,xhr.responseXML);
that.advanceQueue();
}else{
callback.failure(xhr.status);
setTimeout(function(){
that.request(method,url,callback,postVars);
},that.retryDelay * 1000);
}
};
xhr.open(method,url,true);
if(method!=='POST')postVars = null;
xhr.send(postVars);
}
},
createXhrObject:function(){
var methods = [
function(){return new XMLHttpRequest();},
function(){return new ActiveXObject('Msxml2.XMLHTTP');},
function(){return new ActiveXObject('Microsoft.XMLHTTP');},
];
for(var i=0,len=methods.length;i<len;i++){
try{
methods[i]();
}catch(e){
continue;
}
this.createXhrObject = methods[i];
return methods[i]();
}
throw new Error('SimpleHandler: Could not create an XHR object.');
},
advanceQueue:function(){
if(this.queue.length === 0){
this.requestInProgress = false;
return;
}
var req = this.queue.shift();
this.request(req.method,req.url,req.callback,req.postVars,true);
}
};
用以下方法调用,你会发现,除第一个请求外,其它的请求都会在上一个请求完全完成后才执行的。
var myHandler = new QueuedHandler();
var callback = {
success:function(reponseText){console.log('Success');},
failure:function(statusCode){console.log('Failure');}
};
myHandler.request('GET','feedProxy.php?feed=http://julabs.me/blog/feed/rss/',callback);
myHandler.request('GET','feedProxy.php?feed=http://julabs.me/blog/feed/rss/',callback);
myHandler.request('GET','feedProxy.php?feed=http://julabs.me/blog/feed/rss/',callback);
myHandler.request('GET','feedProxy.php?feed=http://julabs.me/blog/feed/rss/',callback);