用定時器實現JavaScript異步執行


逆戰班學習心得

JavaScript是一門基於對象的弱類型語言,它作為瀏覽器腳本語言,主要用途是負責與頁面的交互,以及操作DOM,它的執行環境是單線程的,默認情況JS是同步加載的,也就是 JS的加載是阻塞的,也就是說同一時間只能完成一件事,只能自上而下執行,萬一上一行解析代碼的時間很長,那么下面的代碼就會被阻塞。對於用戶而言,阻塞就意味着"卡死",這樣就導致了很差的用戶體驗。

為了解決這個問題,利用多核CPU的計算能力,於是出現了同步和異步

同步操作,任務遵循隊列順序,異步操作,就相當於並線了,因此異步任務不具有阻塞效應。同步任務都是在主線程中執行,形成了一個執行棧,直到主線程空閑時,才會去事件隊列中查看是否有可執行的異步任務,如果有就推入主進程中。

JS是通過回調函數實現異步的。

一旦用了setTimeout(),里面的回調函數就是異步代碼,加入了任務隊列,延時調用一個函數不馬上執行,而是要等待主隊列為空,並達到定的延時時間才會執行,而且只會執行一次。

我們來通過下面一個例子來理解

 1 setTimeout(function(){
 2 console.log("1")
 3 },500)
 4 console.log("2")
 5 setTimeout(function(){
 6 console.log("3")
 7 },300)
 8 setTimeout(function(){
 9 console.log("5")
10 },0)
11 console.log("4")

 

上面一段代碼的輸出結果為

2

4

5

3

1

從輸出結果中,我們就可以看書JS執行的順序,2和4都為主隊列的同步任務,一開始就執行,執行順序是從上到下。

setTimeout()中的函數,無論寫在JS代碼中的哪個位置,設置的時間即使是0,都為異步執行,在任務隊列中,從主線程執行一開始,就進行計時,一旦主線程空閑,時間短的就立即加入到主線程開始執行,時間長的依然在等待。所以根據設定的等待時間,執行順序為5,3,1

利用setInterval()實現異步執行

定時器的執行原理與延時器相似,只是不清除定時器,他就會反復執行。

1 console.log("1")
2 setInterval(function(){
3 console.log("2")
4 },300)
5 console.log("3")

總結,異步執行的兩個必要條件就是

  1.  主隊列空閑     
  2.  到達執行時間


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM