在實際開發中應使用后端的延時方法,一般為sleep,可以設置延時幾秒后返回給前端請求的數據
眾所周知,在js中,並不存在例如C++或者JAVA、PHP中的sleep延時方法,
目前僅有的所謂延時方法SetTimeout和setInterval等方法看似延時,其實是偽延時。
拿setTimeout來說,當你執行setTimeout("functionA",30)的時候,你希望的是當前進程停留30ms,然后執行下一步。但其實js在執行setTimeout的時候,只是創建了一個新的線程,在這個線程中等待30ms然后執行A函數。也就是說如果你在當前進程setTimeout之后,當前進程會直接執行之后的語句,而新線程等待30ms之后執行A函數,這顯然不符合我們的要求。因為當我們設置延時的目的,是等待ajax返回正確的數據,由於延時函數直接返回,之后的代碼被立即執行,我們的目的就無法達成。
當然我們可以在A函數中寫入所有和AJAX所獲得數據相關的代碼,但是由於異步AJAX要多久才能獲得數據我們並不知曉,並且在不同的服務器情況下,所需要的時間也不同,所以我設計了如下的方法來兼顧延時和數據檢測。
我們一樣定義一個函數A,用於延時執行,當我們在主進程中執行timeout函數之后,主進程當前函數返回。30ms后延時函數線程啟動,A函數被執行。我們設計一個全局變量,用於檢測AJAX返回數據的情況(比方說返回的數據數組為空),然后在A函數中,遞歸調用A函數,即在A函數中若檢測到AJAX數據不正確(比方說時間不夠沒獲取到),則調用setTime函數遞歸執行A函數。當然別忘記了在setTime函數之后,加上return,否則后續函數就會被執行。
這樣一來,當且僅當AJAX獲得的數據正確,我們才會繼續執行,從而達到了延時獲取數據的目的。另外由於AJAX訪問的是JSP,所以最好在寫完JSP以后,利用jsp_precompile方法預編譯成.class文件。不過在我的項目中,這個預編譯方法並沒有得到太好的執行效率提升,服務器開啟第一次訪問依然非常慢,所以才想到利用settimeout遞歸調用的方法
要注意的是,延時千萬不要用for或者while循環,因為主進程永遠不可能被暫停掛起,所以這樣的結果只會是使主進程死循環,瀏覽器CPU占用100%卡死