JavaScript 核心觀念(8)-執行緒與同步、非同步

 嗨,大家好

我是Kris,今天要來分享關於JS的執行緒、事件佇列是如何進行的

那就開始吧~



單執行緒:一次只能做一件事,做完才會做下一件事,JS就是如此,像是單工的感覺。

多執行緒:可以同時執行多個任務。

同步:依照程式碼依序執行fn()

非同步:針對程式語言本身,放到最後才做。


如同上面範例,doWork()會依序執行三個fn(),且都要等上一個完成才能進行下一個。



非同步:因應JS的某些程式的特性,能達成非同步的樣子。

如同上方範例的setTimeout的用意是隔3秒再執行,JS的處理方式是會先放置事件佇列,讓我們繼續瞭解事件佇列是什麼吧!



事件佇列:非同步行為先移到事件佇列,JS還是依照同步的概念在執行程式碼哦!


依照之前分享過的執行堆疊的概念,會先進入do work()、接著eatBreakfast()完成後離開堆疊,再執行callSomeone()

由於callSomeone內有setTimeout屬於非同步事件,會先放到事件佇列Event Queue,也就是圖片中的右邊方格,等待同步執行結束後再進行。

*注意setTimeout不管秒數設定幾秒都是這樣執行,就算是0秒也是哦*



非同步的例子

addEventListener是屬於監聽事件,那範例寫的意思是當有人點擊時,再去執行clickThis
跟setTimeout一樣是一個非同步事件,會先放到事件佇列等待被點擊的時候才會觸發。



補充
事件佇列有多個非同步事件時
*setTimeout有確定秒數,就可以知道誰先執行
*如果沒有確定,其結果會是隨機的,可以用Promise解決
*AJAX也是非同步事件,需要等待回傳資料
*監聽事件是等使用者觸發才會執行
*非同步的概念是因為JS在執行需要呼叫其他資源時,不能準確知道他的完成時間,所以才會先放到事件佇列。




『用現在的努力,換自己喜歡的人生』

评论

此博客中的热门博文

JavaScript 核心觀念(5)-執行環境(Execution context)與執行堆疊(Execution stack)

JavaScript 核心觀念(6)-執行環境與作用域-範圍鍊

JavaScript 核心觀念(3)-的語法作用域(Lexical scope)