xmlhttp是如何完成異步操作的
ajax第一個字母就是Asynchronous-異步,那么到底xmlhttp為何能支持異步操作呢?
大家在使用ajaxpro的時候,經常這么調用服務器端方法
function DoSomething()
{
MyPage.Method1.Do(val1,val2,CallBack);
}

function CallBack(res)
{
//res.value;
}
function CreateXMLHttpRequest(){
// Initialize Mozilla XMLHttpRequest object
if (window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest();
}
// Initialize for IE/Windows ActiveX version
else if (window.ActiveXObject) {
try{
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");
}
catch (e){
try{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e){newsstring = "<div class='loading'>Loading rquest content fail, Please try it again latter
</div>";}
}
}
}
xmlHttp.onreadystatechange = function(){
// only if xmlHttp shows "complete"
if (xmlHttp.readyState == 4){
// only http 200 to process
if ( xmlHttp.status == 200){
CallBack();
}
}
}
xmlHttp.open("GET", url, true);
xmlHttp.setRequestHeader("If-Modified-Since","0");
xmlHttp.send(null);
大家在使用ajaxpro的時候,經常這么調用服務器端方法
function DoSomething()
{
MyPage.Method1.Do(val1,val2,CallBack);
}
function CallBack(res)
{
//res.value;
}這樣在調用DoSomething方法的時候,會很快返回,用戶可以繼續操作界面,直到回調函數得到通知運行,再處理本次請求的結果。這就是一次異步操作。
那是通過什么樣的機制來完成對CallBack函數的通知的呢,XmlHttpRequest對象支持一種onreadystatechange的委托,請求j狀態的更改會觸發這個委托。 HTTP 就緒狀態表示請求的狀態或情形。它用于確定該請求是否已經開始、是否得到了響應或者請求/響應模型是否已經完成。它還可以幫助確定讀取服務器提供的響應文本或數據是否安全。在 Ajax 應用程序中需要了解五種就緒狀態:
0:請求沒有發出(在調用 open() 之前)。
1:請求已經建立但還沒有發出(調用 send() 之前)。
2:請求已經發出正在處理之中(這里通常可以從響應得到內容頭部)。
3:請求已經處理,響應中通常有部分數據可用,但是服務器還沒有完成響應。
4:響應已完成,可以訪問服務器響應并使用它。
在ajax中最常用的就是狀態標志4,回調函數中發現狀態標志為4的時候,就可以做處理請求數據的操作了。
比如創建XmlHttpRequest的代碼如下:
function CreateXMLHttpRequest(){
// Initialize Mozilla XMLHttpRequest object
if (window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest();
}
// Initialize for IE/Windows ActiveX version
else if (window.ActiveXObject) {
try{
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP.3.0");
}
catch (e){
try{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e){newsstring = "<div class='loading'>Loading rquest content fail, Please try it again latter
</div>";}
}
}
}發出xmlhttprequest并支持回調函數的代碼如下:
xmlHttp.onreadystatechange = function(){
// only if xmlHttp shows "complete"
if (xmlHttp.readyState == 4){
// only http 200 to process
if ( xmlHttp.status == 200){
CallBack();
}
}
}
xmlHttp.open("GET", url, true);
xmlHttp.setRequestHeader("If-Modified-Since","0");
xmlHttp.send(null);CallBack函數就可以執行對請求數據的處理了。
作者:jillzhang
出處:http://jillzhang.cnblogs.com/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
出處:http://jillzhang.cnblogs.com/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。



浙公網安備 33010602011771號