最近更新: 2006-08-31

Comment~~該不該用 while 檢查 readyState

在 AJAX 中,用 while 檢查 readyState 是同步模式的做法。這將使整個程式陷在 while 迴圈中,直到 readyState 的狀態符合脫離迴圈的條件為止。最明顯的缺點是頻繁地執行檢查動作,造成程式負載提高。而且這實際上就是同步模式,實作上,還不如明確指定以同步模式執行,即指定 XmlHttpRequest.open() 的第三個參數為 false ,反而較有效率。

function CreateHttpRequest() {
	var HttpRequest = false;
	try {
  		HttpRequest = new XMLHttpRequest();
  		// for almost all browsers. (Maybe included M$IE7)

	} catch (tryMSIE){
  		try {
    		HttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
  		} catch (tryMSIE2) {
    		try {
      			HttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
    		} catch (NotSupported) {
      			HttpRequest = false;
    		}
  		}
	}
	return HttpRequest;
}
同步模式範例。
var request = CreateHttpRequest();
request.open("GET", "test.xml", false);
request.send(null);

// document loaded

window.alert('test.xml loaded.');
 
非同步模式範例。
var request = CreateHttpRequest();
request.open("GET", "test.xml", true);
request.send(null);

while(request.readyState != 4) {
    //do nothing...

}

// document loaded

window.alert('test.xml loaded.');

在非同步模式下,最佳實作方式不是去「檢查 readyState 的狀態」,而是去「等待 readyState 的改變事件」。所以要為 XmlHttpRequest.onreadystatechange 指派處理函數,並在調用 XmlHttpRequest.open() 時,指派第三個參數為 true (此亦為預設值),即啟用非同步模式。如此一來,瀏覽器就會另外產生一個 thread 執行 send() ,而在 state 改變時,喚起 master thread 的處理函數。

JavaScript 配合 XmlHttpRequest ,透過事件驅動模式,即可讓我們運用 multi-threads 的工作模式。和以往在 C/C++ 中調用 pthread functions 的繁複過程相比,實在是簡單易用得太多了。喔,具有這種經驗的 C/C++ programmer 一定了解非同步工作模式的背後,隱藏著足以獨立成冊的實作細節。

相關文章
樂多舊網址: http://blog.roodo.com/rocksaying/archives/2086597.html