JavaScript系列之―同步還是異步?
2024-09-06 12:41:24
供稿:網友
從今天開始,我會不定期的寫一些關于JavaScript的東西,包括語言,應用等方面。組成JavaScript系列。
如果沒有特殊的說明,這里假定JavaScript的執行環境是在瀏覽器(browser)當中的。
今天開始第一次,討論一下同步和異步。
曾經查詢過一些JavaScript的信息,發現google出來的結果都是詢問JavaScript如何能夠實現異步的代碼。
而我,很不幸,查詢的卻是如何讓JavaScript實現異步調用的同步(是不是挺起來很詭異)。
首先說一下JavaScript當中的異步方法。
其實這個問題是大家經常要碰到的。而且這個實現也很簡單。我就不多說了。
給兩段代碼
setTimeout方法,他讓你的代碼在指定的時間(毫秒)之后執行指定的方法。只執行一次。
比如:
alert(1);
setTimeout(”alert(2)”, 1000);
alert(3);
代碼在執行到setTimeout的時候,會繼續執行下面的代碼(alert(3))而不會被阻塞。等待1000ms之后執行alert(2)
setInterval方法,他讓你的代碼每隔指定的時間,執行指定的方法,直到調用clearInterval
比如:
alert(1);
timer = setInterval(”alert(2)”, 1000);
alert(3);
代碼基本上和上面的相同,不同的是,每隔1000ms就會執行一次alert(2),直到調用
clearInterval(timer);
我們應該注意到setTimeout和setInterval都是window的方法。
我們可以直接使用,但是規范的還是調用window.setTimeout window.setInterval,之所以提及這個,我會在以后的JavaScript系列中繼續講解。
現在該說一下我遇到的問題了。
我現在使用dwr作為AJAX的server端引擎,在調用dwr方法的時候,需要提供一個回調方法(callback function)來接受server的返回結果。
而這個回調方法是不會被阻塞的。此時browser回啟動另外的現成處理。
這個很好理解,因為dwr的這個方法執行的時間是無法預料的,如果此時調用被阻塞,而server又花相當長的時間進行處理。那么瀏覽器就會死在這里。從用戶體驗的角度是根本無法接受的。
這里的例子代碼是
…
ServerHandler.getString(”Weiming”, function (str) { //”Weiming”是傳回server的參數
alert(str);
}); // ServerHandler是dwr提供的server方法的interface,具體使用請參見dwr網站。
alert(1);
在執行的過程中,會先執行alert(1),然后在一個無法預料的時間后執行alert(str)。
如果一次簡單的比如hello world的調用是不會出問題的。
但是如果我要執行的一系列的dwr function是有前后順序的,比如后面執行的需要前面的返回結果,簡單的代碼書寫順序是無法保證執行順序的。
var myID = null;
ServerHandler.getID(function (id) {
myID = id; //無法預料何時會執行這句話