超时处理---Ajax之五
上一篇只是检查是否超时,超时后却不做任何处理。这里如果超时,会给failure第二个参数msg赋值为“request timeout”。
?
这样使用者能清楚的知道一次HTTP请求的细节。实现细节较为诡异,得慢慢体会。这里timeout的效果和JQuery,Ext是一样的。如下
?
Ajax.text('../servlet/Ajax',{timeout : 2000,success : function(result){},failure : function(xhr,msg){alert(msg);}});
?
?
源码见附件
xhr.onreadystatechange = function(){if (xhr.readyState == 4 && !isTimeout){_onStateChange(xhr, type, success, failure);clearTimeout(timer);}else{}};setTimeout(function() { // 调用timeout句柄 dispatchEvent("timeout"); // 消除浏览器差异 var onreadystatechange = xmlHttp.onreadystatechange; xmlHttp.onreadystatechange = function() {}; try { var oldAbort = xmlHttp.abort(); xmlHttp.abort = function() { oldAbort.call(xmlHttp); xmlHttp.readyState = 0; }; } catch(e) {} xmlHttp.abort(); // 如果xmlHttp需要第二次提交的话,需要以下这句,否则不需要 xmlHttp.onreadystatechange = onreadystatechange;}, 超时时间);var ontimeout = function() {.....}
setTimeout(function() { // 调用timeout句柄 dispatchEvent("timeout"); // 消除浏览器差异 var onreadystatechange = xmlHttp.onreadystatechange; xmlHttp.onreadystatechange = function() {}; try { var oldAbort = xmlHttp.abort(); xmlHttp.abort = function() { oldAbort.call(xmlHttp); xmlHttp.readyState = 0; }; } catch(e) {} xmlHttp.abort(); // 如果xmlHttp需要第二次提交的话,需要以下这句,否则不需要 xmlHttp.onreadystatechange = onreadystatechange;}, 超时时间);
setTimeout(function() { // 调用timeout句柄 dispatchEvent("timeout"); // 消除浏览器差异 var onreadystatechange = xmlHttp.onreadystatechange; xmlHttp.onreadystatechange = function() {}; try { var oldAbort = xmlHttp.abort(); xmlHttp.abort = function() { oldAbort.call(xmlHttp); xmlHttp.readyState = 0; }; } catch(e) {} xmlHttp.abort(); // 如果xmlHttp需要第二次提交的话,需要以下这句,否则不需要 xmlHttp.onreadystatechange = onreadystatechange;}, 超时时间);