首頁 >web前端 >js教程 >探討Ajax中有關readyState和status的問題

探討Ajax中有關readyState和status的問題

亚连
亚连原創
2018-05-23 16:58:061777瀏覽

這篇文章主要介紹了探討Ajax中有關readyState(狀態值)和status(狀態碼)的問題的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下

先看下面一段程式碼,然後再跟大家詳細介紹,Ajax中有關readyState(狀態值)和status(狀態碼)的問題,具體內容如下:

##

var getXmlHttpRequest = function () {
try{
//主流浏览器提供了XMLHttpRequest对象
return new XMLHttpRequest();
}catch(e){
//低版本的IE浏览器没有提供XMLHttpRequest对象,IE6以下
//所以必须使用IE浏览器的特定实现ActiveXObject
return new ActiveXObject("Microsoft.XMLHTTP");
}
};
var xhr = getXmlHttpRequest();
// readyState 0=>初始化 1=>载入 2=>载入完成 3=>解析 4=>完成
// console.log(xhr.readyState); 0
xhr.open("TYPE", "URL", true);
// console.log(xhr.readyState); 1
xhr.send();
// console.log(xhr.readyState); 1
xhr.onreadystatechange = function () {
// console.log(xhr.status); //HTTP状态吗
// console.log(xhr.readyState); 2 3 4
if(xhr.readyState === 4 && xhr.status === 200){
alert(xhr.responseText);
}
};

#1.Ajax:readyState(狀態值)和status(狀態碼)的區別

readyState,是指執行AJAX所經歷過的幾種狀態,無論訪問是否成功都將回應的步驟,可以理解成為AJAX運行步驟,使用“ajax.readyState”獲得


status,是指無論AJAX訪問是否成功,由HTTP協定根據所提交的信息,伺服器所傳回的HTTP頭資訊代碼,使用「ajax.status」獲得

整體理解:可以簡單的理解為state代表一個整體的狀態。而status是這個大的state下面具體的小的狀態。

2.什麼是readyState

readyState是XMLHttpRequest物件的屬性,用來識別目前XMLHttpRequest物件處於什麼狀態。


readyState總共有5個狀態值,分別為0~4,每個值代表了不同的意義

0:初始化,XMLHttpRequest物件還沒有完成初始化

#1:載入完成,XMLHttpRequest物件開始發送請求

2:載入完成,XMLHttpRequest物件的請求發送完成

3:解析,XMLHttpRequest物件開始讀取伺服器的回應

4:完成,XMLHttpRequest物件讀取伺服器回應結束

3.什麼是status##status是XMLHttpRequest物件的一個屬性,表示回應的HTTP狀態碼

在HTTP1.1協定下,HTTP狀態碼總共可分為5大類

1xx:訊息回應類,表示接收到請求並且繼續處理

2xx:處理成功回應類,表示動作被成功接收、理解和接受

3xx:重定向回應類,為了完成指定的動作,必須接受進一步處理

4xx:客戶端錯誤,客戶請求包含語法錯誤或無法正確執行

5xx:服務端錯誤,伺服器不能正確執行一個正確的請求

100-客戶必須繼續發出請求

101-客戶要求伺服器根據請求轉換HTTP協定版本

200-交易成功

#201-提示知道新檔案的URL

#202-接受與處理、但處理未完成

203-傳回訊息不確定或不完整

204-請求收到,但回傳訊息為空

205-伺服器完成了請求,使用者代理程式必須重設目前已經瀏覽過的檔案

206-伺服器已經完成了部分使用者的GET請求

#300-請求的資源可在多處得到

301——刪除請求資料

302——在其他地址發現了請求資料

303——建議客戶訪問其他URL或訪問方式

304-客戶端已經執行了GET,但檔案未變更

305-請求的資源必須從伺服器指定的位址得到

306-前一版本HTTP中所使用的程式碼,現行版本不再使用

307-申明請求的資源暫時性刪除

400-錯誤請求,如語法錯誤

401—請求授權失敗

402—保留有效ChargeTo頭回應

#403—請求不允許

404—沒有發現檔案、查詢或URl

405-使用者在Request-Line欄位定義的方法不允許

406-根據使用者傳送的Accept拖,請求資源不可存取

#407-類似401 ,使用者必須先在代理伺服器上得到授權

408-客戶端沒有在使用者指定的餓時間內完成請求

409-對目前資源狀態,請求不能完成

410-伺服器上不再有此資源且無進一步的參考位址

411-伺服器拒絕使用者定義的Content-Length屬性請求

#412-一或多個請求頭欄位在目前請求中錯誤

413-請求的資源大於伺服器允許的大小

414-請求的資源URL長於伺服器允許的長度

415-請求資源不支援請求項目格式

416-請求中包含Range請求頭字段,在目前請求資源範圍內沒有range指示值,請求也不包含If-Range請求頭字段

417-伺服器不符合請求Expect頭欄位指定的期望值,如果是代理伺服器,可能是下一層伺服器不能滿足請求

500-伺服器產生內部錯誤

501-伺服器不支援請求的函數

502-伺服器暫時無法使用,有時是為了防止系統過載

#503-伺服器過載或暫停維修

504-關口過載,伺服器使用另一個關卡或服務來回應用戶,等待時間設定值較長

505-伺服器不支援或拒絕支請求頭中指定的HTTP版本

4.思考问题:为什么onreadystatechange的函数实现要同时判断readyState和status呢?

第一种思考方式:只使用readyState

var getXmlHttpRequest = function () {
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
}
else if (window.ActiveXObject) {
return new ActiveXObject("Microsoft.XMLHTTP");
}
};
var xhr = getXmlHttpRequest();
xhr.open("get", "1.txt", true);
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
alert(xhr.responseText);
}
};

服务响应出错了,但还是返回了信息,这并不是我们想要的结果

如果返回不是200,而是404或者500,由于只使用readystate做判断,它不理会放回的结果是200、404还是500,只要响应成功返回了,就执行接下来的javascript代码,结果将造成各种不可预料的错误。所以只使用readyState判断是行不通的。

第二种思考方式:只使用status判断

var getXmlHttpRequest = function () {
try{
return new XMLHttpRequest();
}catch(e){
return new ActiveXObject("Microsoft.XMLHTTP");
}
};
var xhr = getXmlHttpRequest();
xhr.open("get", "1.txt", true);
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.status === 200) {
alert("readyState=" + xhr.readyState + xhr.responseText);
}
};

事实上,结果却不像预期那样。响应码确实是返回了200,但是总共弹出了3次窗口!第一次是“readyState=2”的窗口,第二次是“readyState=3”的窗口,第三次是“readyState=4”的窗口。由此,可见onreadystatechange函数的执行不是只在readyState变为4的时候触发的,而是readyState(2、3、4)的每次变化都会触发,所以就出现了前面说的那种情况。可见,单独使用status判断也是行不通的。

5.由上面的试验,我们可以知道判断的时候readyState和status缺一不可。那么readyState和status的先后判断顺序会不会有影响呢?我们可以将status调到前面先判断,代码如 xhr.status === 200 && xhr.readyState === 4

事实上,这对于最终的结果是没有影响的,但是中间的性能就不同了。由试验我们知道,readyState的每次变化都会触发onreadystatechange函数,假如先判断status,那么每次都会多判断一次status的状态。虽然性能上影响甚微,不过还是应该抱着追求极致代码的想法,把readyState的判断放在前面。

xhr.readyState === 4 && xhr.status === 200

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

全面解析$.Ajax()方法参数(图文教程)

IE8下Ajax缓存问题及解决办法

浅谈ajax请求技术

以上是探討Ajax中有關readyState和status的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn