1. 程式人生 > >理解js單執行緒非同步機制

理解js單執行緒非同步機制

1.最近在維護一個專案,用到的主要語言是JS。因此在寫需求功能時對JS的非同步有了進一步的理解。

JS是單執行緒的,但是JS是可以非同步的。

setTimeout(function(){

console.log();

},1000)  執行setTimeout時,會把裡面的匿名函式放到callback queue回撥函式佇列中去,等待主執行緒的召喚,等執行完主執行緒再把匿名函式放到stack棧裡執行。

用時要注意,別把setTimeout函式放到for迴圈裡,因為等執行完for迴圈再來執行setTimeout裡的匿名函式時,i的下標已經超出陣列索引了。

2.快取

在需要請求大量資料時,可以事先進行請求,然後儲存下來,之後頁面要用這些資料可以直接讀取快取用,而不用再次請求。

在頁面載入的時候我們就開始請求資料,先把請求到的資料快取下來(當然這些資料應該是固定的,如果每次點選要請求不同的資料要另當別論),等下次用時已經有資料了。

比如我的專案遇到一次操作要請求25000多條資料,而請求時間大約4-5秒,我就把這個操作提前到載入頁面時,等下次操作時不必再請求資料,直接讀取資料即可,這樣效率就提上去了。(在這裡原來用的是eval對請求到的json資料進行解析,發現效率不高,解析過程頁面會卡頓1-2s,改為JSON.parse()後頁面不再卡頓。那麼現在可以說完全實現了非同步請求資料,在頁面毫無感覺的情況下已經將資料準備完畢)

3.關於快取的思想我理解的就是我們把一些必須要經過的步驟提前了,等下次要用時即可省略該步驟,從而得到效率上的提升。

同時關於JS非同步的機制我想可以利用它非同步的特性,讓它的callback queue佇列不要空著,我們可以一直讓它忙碌著做一些預處理,這樣應該在效率提升上會有點幫助吧

4.再說說瀏覽器,瀏覽器主要包含JS引擎、GUI介面渲染渲染執行緒、事件觸發執行緒和http請求執行緒。

對於JavaScript引擎,事件觸發執行緒捕捉到的如點選事件會非同步傳到JS任務佇列中,如果JS正在處理耗時的操作,那麼這個滑鼠點選事件就會等待執行,即使用者看到的介面卡頓。

還是要利用好js的非同步機制,多寫寫回調函式,在必要時一定用得上。

如下:

function closeDisplay(){

console.log("display none");

}

function mainProgram(callback){

console.log("執行中...")

console.log("執行完畢,執行回撥函式");

callback();

}

mainProgram(closeDisplay);

以上僅個人理解,這裡看到有幾篇不錯的關於JS單執行緒和非同步的文章分享一下

https://www.cnblogs.com/woodyblog/p/6061671.html

https://www.cnblogs.com/hksac/p/6596105.html

http://blog.csdn.net/baidu_32262373/article/details/54969696