上一篇只是检查是否超时,超时后却不做任何处理。这里如果超时,会给failure第二个参数msg赋值为“request timeout”。
这样使用者能清楚的知道一次HTTP请求的细节。实现细节较为诡异,慢慢体会。这里timeout的效果和JQuery,Ext是一样的。如下
Ajax.text(\'../servlet/Ajax\',{
timeout : 2000,
success : function(result){},
failure : function(xhr,msg){
alert(msg);
}
});
完整源码
Ajax =
function(){
function request(url,opt){
function fn(){}
opt = opt || {};
var async = opt.async !== false,
method = opt.method || \'GET\',
type = opt.type || \'text\',
encode = opt.encode || \'UTF-8\',
timeout = opt.timeout || 0,
data = opt.data || null,
success = opt.success || fn,
failure = opt.failure || fn;
method = method.toUpperCase();
if(data && typeof data == \'object\'){
data = _serialize(data);
}
if(method == \'GET\' && data){
url += (url.indexOf(\'?\') == -1 ? \'?\' : \'&\') + data;
data = null;
}
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\'Microsoft.XMLHTTP\');
if(!xhr){return;}
var isTimeout = false, timer;
if(timeout>0){
timer = setTimeout(function(){
xhr.abort();
isTimeout = true;
},timeout);
}
xhr.onreadystatechange = function(){
if (xhr.readyState == 4 && !isTimeout){
_onStateChange(xhr, type, success, failure);
clearTimeout(timer);
}else{}
};
xhr.open(method,url,async);
if(method == \'POST\'){
xhr.setRequestHeader(\'Content-type\', \'application/x-www-form-urlencoded;charset=\' + encode);
}
xhr.send(data);
return xhr;
}
function _serialize(obj){
var a = [];
for(var k in obj){
var val = obj[k];
if(val.constructor == Array){
for(var i=0,len=val.length;i<len;i++){
a.push(k + \'=\' + encodeURIComponent(val[i]));
}
}else{
a.push(k + \'=\' + encodeURIComponent(val));
}
}
return a.join(\'&\');
}
function _onStateChange(xhr,type,success,failure){
var s = xhr.status, result;
if(s>= 200 && s < 300){
switch(type){
case \'text\':
result = xhr.responseText;
break;
case \'json\':
result = function(str){
return (new Function(\'return \' + str))();
}(xhr.responseText);
break;
case \'xml\':
result = xhr.responseXML;
break;
}
success(result);
}else if(s===0){
failure(xhr,\'request timeout\');
}else{
failure(xhr,xhr.status);
}
xhr = null;
}
return (function(){
var Ajax = {request:request}, types = [\'text\',\'json\',\'xml\'];
for(var i=0,len=types.length;i<len;i++){
Ajax[types[i]] = function(i){
return function(url,opt){
opt = opt || {};
opt.type = types[i];
return request(url,opt);
}
}(i);
}
return Ajax;
})();
}();
相关: