可重用类:
1 function Ajax() { 2 var oXhr = null; 3 var msxml_progid = [ 4 'MSXML2.XMLHTTP.6.0', 5 'MSXML3.XMLHTTP', 6 'Microsoft.XMLHTTP', 7 'MSXML2.XMLHTTP.3.0' 8 ]; 9 try{ 10 oXhr = new XMLHttpRequest(); //先尝试标准方法 11 }catch(e) { 12 for(var i=0, len=msxml_progid.length; i<len; i++) { 13 try{ 14 oXhr = new ActiveXObject(msxml_progid[i]); 15 break; 16 }catch(e2) {} 17 } 18 }finally { 19 if(!oXhr) return; 20 } 21 this.oXhr = oXhr; 22 } 23 Ajax.prototype.get(url, options) { 24 if(this.oXhr) { 25 var oXhr = this.oXhr; 26 var aborted = false; //请求是否被取消 27 //默认参数 28 var _options = { 29 method: 'GET', 30 timeout: 5, //s为单位 31 onerror: function() {}, 32 onsuccess: function() {} 33 }; 34 //覆盖各个选项 35 for(var key in options) { 36 _options[key] = options[key]; 37 } 38 function checkForTimeout() { 39 if(oXhr.readyState != 4) { 40 aborted = true; 41 oXhr.abort(); 42 } 43 } 44 //超时调用函数取消请求 45 setTimeout(checkForTimeout, _options.timeout * 1000); 46 function onreadystateCallback() { 47 if(oXhr.readyState == 4) { 48 if(!aborted && oXhr.status>=200 && oXhr.status<=300) { 49 _options.onsuccess(oXhr); 50 }else { 51 _options.onerror(oXhr); 52 } 53 } 54 } 55 oXhr.open(_options.method, url, true); 56 oXhr.onreadystatechange = onreadystateCallback; 57 oXhr.send(); 58 } 59 };
为失败做准备
- 如果请求超时会发生什么事?应该等待多长时间
解决办法:等待一段时间后调用超时,并处理超时错误。
- 如果取回的数据与预期不符怎么办
应在服务器端设置应急方案,在结果里返回某种错误代码。客户端接收数据后,先有无检查错误代码。
这是处理JSON数据格式的情况:
{“error”:{“id”:1, “message”:”Your session has ,,,”}} var UNKNOWN = 0; function processRequestSuccess(oXhr) { var obj = oXhr.responseText.parseJSON(); if(!obj) { processError(UNKNOWN); }else if(obj.error) { processError(obj.error.id, obj.error.message); }else { //按照正常情况继续处理请求 //... } }
- 如果发出了多个请求会发生什么事?(尤其是在响应返回的顺序和请求发生的顺序不一致的情况下!)
在web应用中,多重请求是司空见惯的。
1) 第一次请求已经发出,而后续的请求应该覆盖掉第一次请求。
2) 连续发出了多个请求,但调用返回的顺序是不定的。 (用一个令牌来跟踪每次调用)
如果打算重用这个Ajax对象,让它发送多个请求,那么必须在open调用之后声明onreadystatechange事件,否者IE5/6上只有第一次调用成功执行,其他都会失败