zoukankan      html  css  js  c++  java
  • 处理超时Ajax之五

    上一篇只是检查是否超时,超时后却不做任何处理。这里如果超时,会给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;
    	})();
    }();
    

    相关:

    ajax_05.zip

    https://github.com/snandy/io

  • 相关阅读:
    C#概述
    作为一个程序员小小感悟!!
    c# 合并两个DataTable
    C# FastReport .NET打印
    c# System.Net.Sockets =》TcpListener用法
    开博第一章
    Vue 报错 Uncaught (in promise)
    ASP.NET MVC 中的过滤器
    SpringBoot 打包成war
    SprintBoot 实现上传下载
  • 原文地址:https://www.cnblogs.com/snandy/p/2026734.html
Copyright © 2011-2022 走看看