這里是使用的XMLHttpRequest2中的API笑窜,口蹄疫通過XMLHttpRequest對象的?abort( )方法?來取消正在進行的HTTP請求,abort( )方法是在XMLHttpRequest和XMLHttpRequest2中都可用的乘瓤,調(diào)用abort( )方法在這個對象上觸發(fā)abort事件。
調(diào)用abort( )的主要原因是完成像取消或超時請求消耗的是啊進太長或當(dāng)響應(yīng)變得無關(guān)時的情況?
例如:使用XMLHttpRequest為文本輸入域請求自動完成推薦,如果用戶在服務(wù)器的建議到達(dá)之前輸入了新的字符兼搏,這時等待請求就不再有用了,所有應(yīng)該終止
XMLHttpRequest2中定義了?timeout?屬性來指定請求自動終止的毫秒數(shù)沙郭,也定義了timeout事件用于超時發(fā)生時觸發(fā)佛呻,但是到目前位置,瀏覽器還不支持這些自動超時病线,?
但是我們可以使用setTimeout( )和abort( )方法來實現(xiàn)自己的超時
/*
發(fā)起HTTP GET請求獲取指定URL的內(nèi)容
如果響應(yīng)成功到達(dá)吓著,則傳入responseText給回調(diào)函數(shù)
如果響應(yīng)在timeout時間內(nèi)沒有到達(dá),則中止請求
瀏覽器可能會在abort()后出啊發(fā)readystatechange
如果部分請求結(jié)果到達(dá)送挑,甚至可能設(shè)置status屬性
所有需要設(shè)置一個標(biāo)記绑莺,當(dāng)部分且超時的響應(yīng)到達(dá)時不會調(diào)用回調(diào)函數(shù)
如果使用load(當(dāng)請求完成時觸發(fā))事件就沒有這個風(fēng)險
/*
發(fā)起HTTP GET請求獲取指定URL的內(nèi)容
如果響應(yīng)成功到達(dá),則傳入responseText給回調(diào)函數(shù)
如果響應(yīng)在timeout時間內(nèi)沒有到達(dá)惕耕,則中止請求
瀏覽器可能會在abort()后出啊發(fā)readystatechange
如果部分請求結(jié)果到達(dá)纺裁,甚至可能設(shè)置status屬性
所有需要設(shè)置一個標(biāo)記,當(dāng)部分且超時的響應(yīng)到達(dá)時不會調(diào)用回調(diào)函數(shù)
如果使用load(當(dāng)請求完成時觸發(fā))事件就沒有這個風(fēng)險*/
function (url,timeout,callback) {
var request =new XMLHttpRequest();
var time =false;//是否超時
? ? var timer =setTimeout(function(){
????timeout =true;
????request.abort(); / /請求中止
?},timeout);
request.open("GET",url);
request.onreadystatechange =function(){
if(request.readyState !==4)continue;//忽略未完成的請求
? ? ? ? if(timeout)return;//忽略中止請求
? ? ? ? clearTimeout(timer);//取消等待的超時
? ? ? ? if(request.status ===200)
callback(request.responseText);
}
request.send(null);
}