iT邦幫忙

0

【30 天JavaScript 實戰 】 Day 15 |非同步觀念

  • 分享至 

  • xImage
  •  

今日的目標:

  • 了解同步 / 非同步
  • 了解 Event Loop
  • Task 與 Microtask 的差別

一、同步 / 非同步是什麼?

同步(Synchronous)
同步的世界裡,程式碼「一行行照順序」執行。
就像排隊買飲料,前面的人沒點完,你不能動。

console.log("A");
console.log("B");
console.log("C");

輸出結果是:

A
B
C

同步:誰先寫誰先執行

非同步(Asynchronous)
當我們呼叫 setTimeout()、fetch()、addEventListener() 去等「要等的東西」,
這些任務會被交給瀏覽器的其他系統(Web API) 去做。

當它們完成後,會把「回呼(callback)」放回 JS 的任務中,等主線空下來,Event Loop 再安排它執行。
也就是說,JS 會把「需要等的工作」交給瀏覽器或 Web API 幫忙處理,等結果回來再通知你。
就像是點了外送,你點完餐(下指令)後,不用傻傻等外送員回來再繼續幹別的事~

console.log("A");

setTimeout(() => {
  console.log("B");
}, 1000);

console.log("C");

結果會是:

A
C
B

非同步:不用等,先繼續跑,結果回來再通知。

二、Event Loop 是誰?

JS 只有一條主線(單執行緒),靠 Event Loop 把「外面做完的事」排回來跑。
流程是:

  1. JS 執行主程式(同步程式碼)
  2. 碰到非同步任務(例如 setTimeout、fetch)交給外面的系統處理
  3. 主程式跑完後,Event Loop 會檢查任務清單
  4. 有結果的任務會一個一個回來執行

三、Task 與 Microtask 的差別

Microtask(微任務)

  • 優先度比 Task 高。
  • 一旦開始清 microtask,就會「清到底」(直到 queue 空)

常見來源

類型 範例
Promise .then(), .catch(), .finally()

Task(巨任務、宏任務)

  • 是「一般非同步任務」的集合。

常見來源

類型 範例
計時器 setTimeout, setInterval
事件回呼 click, scroll
網路 XMLHttpRequest, fetch 的底層任務

比較

類型 來源例子 執行時機 說明
Task(巨任務) setTimeout, setInterval, fetch 主程式與 microtask 全部跑完後 下一輪 Event Loop
Microtask(微任務) Promise.then, queueMicrotask Task 結束前立即執行 優先度更高!

/images/emoticon/emoticon08.gif


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言