1. 程式人生 > >使用js和AJAX實現的非同步請求

使用js和AJAX實現的非同步請求

0:請求沒有發出(在呼叫 open() 之前)。
1:請求已經建立但還沒有發出(呼叫 send() 之前)。
2:請求已經發出正在處理之中(這裡通常可以從響應得到內容頭部)。
3:請求已經處理,響應中通常有部分資料可用,但是伺服器還沒有完成響應。
4:響應已完成,可以訪問伺服器響應並使用它。
 
與大多數跨瀏覽器問題一樣,這些就緒狀態的使用也不盡一致。您也許期望任務就緒狀態從0到1、2、3 再到4,但實際上很少是這種情況。一些瀏覽器從不報告0或1而直接從2開始,然後是3和4。其他瀏覽器則報告所有的狀態。還有一些則多次報告就緒狀態 1。在上一節中看到,伺服器多次呼叫updatePage(),每次呼叫都會彈出警告框——可能和預期的不同! 
對於 Ajax 程式設計,需要直接處理的惟一狀態就是就緒狀態 4,它表示伺服器響應已經完成,可以安全地使用響應資料了。基於此,回撥方法中的第一行應該如下檢查就緒狀態 
function updatePage() {
     if (request.readyState == 4)
       alert("Server is done!");
}
修改後就可以保證伺服器的處理已經完成。嘗試執行新版本的Ajax程式碼,現在就會看到與預期的一樣,只顯示一次警告資訊了。
HTTP 狀態碼
 
雖然程式碼看起來似乎不錯,但是還有一個問題——如果伺服器響應請求並完成了處理但是報告了一個錯誤怎麼辦?要知道,伺服器端程式碼應該明白它是由Ajax、JSP、普通HTML表單或其他型別的程式碼呼叫的,但只能使用傳統的Web專用方法報告資訊。而在Web世界中,HTTP程式碼可以處理請求中可能發生的各種問題。比方說,您肯定遇到過輸入了錯誤的 URL 請求而得到 404 錯誤碼的情形,它表示該頁面不存在。這僅僅是 HTTP 請求能夠收到的眾多錯誤碼中的一種(完整的狀態碼請參閱相關資料)。表示所訪問資料受到保護或者禁止訪問的 403 和 401 也很常見。無論哪種情況,這些錯誤碼都是從完成的響應 得到的。換句話說,伺服器履行了請求(即 HTTP 就緒狀態是 4)但是沒有返回客戶機預期的資料。因此除了就緒狀態外,還需要檢查 HTTP 狀態。我們期望的狀態碼是 200,它表示一切順利。如果就緒狀態是 4 而且狀態碼是 200,就可以處理伺服器的資料了,而且這些資料應該就是要求的資料(而不是錯誤或者其他有問題的資訊)。因此還要在回撥方法中增加狀態檢查,檢查 HTTP 狀態碼。 
function updatePage() {
     if (request.readyState == 4)
       if (request.status == 200)
         alert("Server is done!");
}
為了增加更健壯的錯誤處理並儘量避免過於複雜,可以增加一兩個狀態碼檢查,請看一看清單 15 中修改後的 updatePage() 版本。