宏任務和微任務

在前端開發中,**宏任務(Macro Task)**和**微任務(Micro Task)**是 JavaScript 事件循環(Event Loop)中的兩個重要概念。它們決定了異步代碼的執行順序。

---

### 1. **事件循環(Event Loop)**
JavaScript 是單線程的,通過事件循環機制處理異步任務。事件循環的核心是:
- **主線程**:執行同步代碼。
- **任務隊列**:存放異步任務的回調函數。
- **事件循環**:不斷檢查任務隊列,將任務推入主線程執行。

任務隊列分為兩種:
- **宏任務隊列**:存放宏任務。
- **微任務隊列**:存放微任務。

---

### 2. **宏任務(Macro Task)**
宏任務是指需要較長時間執行的任務,通常包括:
- `setTimeout` 和 `setInterval` 的回調。
- `setImmediate`(Node.js 特有)。
- `requestAnimationFrame`(瀏覽器特有)。
- I/O 操作(如文件讀寫、網絡請求)。
- UI 渲染(瀏覽器特有)。

**執行時機**:每次事件循環中,主線程會執行一個宏任務,然后檢查微任務隊列。

---

### 3. **微任務(Micro Task)**
微任務是指需要盡快執行的任務,通常包括:
- `Promise` 的回調(`then`、`catch`、`finally`)。
- `MutationObserver`(監聽 DOM 變化)。
- `process.nextTick`(Node.js 特有)。

**執行時機**:每次宏任務執行完畢后,事件循環會清空微任務隊列中的所有任務,然后再執行下一個宏任務。

---

### 4. **執行順序**
事件循環的執行順序如下:
1. 執行主線程的同步代碼。
2. 執行當前宏任務。
3. 清空微任務隊列中的所有任務。
4. 執行 UI 渲染(瀏覽器)。
5. 執行下一個宏任務。

---

### 5. **代碼示例**
```javascript
console.log('1. 同步代碼'); // 同步代碼,立即執行

setTimeout(() => {
? console.log('4. 宏任務 - setTimeout'); // 宏任務
}, 0);

Promise.resolve().then(() => {
? console.log('3. 微任務 - Promise'); // 微任務
});

console.log('2. 同步代碼'); // 同步代碼,立即執行
```

**輸出結果**:
```
1. 同步代碼
2. 同步代碼
3. 微任務 - Promise
4. 宏任務 - setTimeout
```

**解釋**:
1. 同步代碼立即執行。
2. `Promise` 的微任務在同步代碼之后、宏任務之前執行。
3. `setTimeout` 的宏任務在微任務之后執行。

---

### 6. **宏任務和微任務的區別**
| 特性 ? ? ? ? ? ?| 宏任務(Macro Task) ? ? ? ? ? ? ? | 微任務(Micro Task) ? ? ? ? ? ? ? |
|-----------------|------------------------------------|------------------------------------|
| **執行時機** ? ? | 每次事件循環執行一個宏任務 ? ? ? ? | 每次宏任務執行后清空微任務隊列 ? ? |
| **常見任務** ? ? | `setTimeout`、`setInterval`、I/O ? | `Promise`、`MutationObserver` ? ? ?|
| **優先級** ? ? ? | 較低 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | 較高 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| **隊列類型** ? ? | 宏任務隊列 ? ? ? ? ? ? ? ? ? ? ? ? | 微任務隊列 ? ? ? ? ? ? ? ? ? ? ? ? |

---

### 7. **實際應用**
- **優化性能**:將高優先級任務放入微任務隊列,確保盡快執行。
- **避免阻塞**:將耗時任務放入宏任務隊列,避免阻塞主線程。
- **控制執行順序**:通過微任務和宏任務的特性,控制異步代碼的執行順序。

---

### 總結
- **宏任務**:需要較長時間執行的任務,如 `setTimeout`、I/O 操作。
- **微任務**:需要盡快執行的任務,如 `Promise`、`MutationObserver`。
- **執行順序**:同步代碼 → 微任務 → 宏任務 → UI 渲染 → 下一個宏任務。

理解宏任務和微任務的機制,有助于更好地掌握 JavaScript 的異步編程和事件循環。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895634.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895634.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895634.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人工智能 - 機器學習、深度學習、強化學習是人工智能領域的理論基礎和方法論

機器學習、深度學習、強化學習是人工智能領域的三大核心方向,各自具有獨特的理論基礎和方法論。以下是它們的核心理論知識總結: 一、機器學習(Machine Learning, ML) 1. 基礎概念 目標:通過數據驅動的方式,讓機器從經驗中學習規律,完成預測、分類或決策任務。 核心范式…

java處理pgsql的text[]類型數據問題

背景 公司要求使用磐維數據庫,于是去了解了這個是基于PostgreSQL構建的,在使用時有場景一條圖片數據中可以投放到不同的頁面,由于簡化設計就放在數組中,于是使用了text[]類型存儲;表結構 #這是一個簡化版表結構&…

. Unable to find a @SpringBootConfiguration(默認軟件包中的 Spring Boot 應用程序)

解決: 新建一個包即可 問題: 默認軟件包中的 Spring Boot 應用程序。 原因: 默認包的定義 : 如果一個 Java 類沒有使用 package 聲明包名,則該類會被放置在默認包中。Spring Boot 遵循 Java 的包管理約定&#xff…

C語言——排序(冒泡,選擇,插入)

基本概念 排序是對數據進行處理的常見操作,即將數據按某字段規律排列。字段是數據節點的一個屬性,比如學生信息中的學號、分數等,可針對這些字段進行排序。同時,排序算法有穩定性之分,若兩個待排序字段一致的數據在排序…

滲透利器:YAKIT 工具-基礎實戰教程.

YAKIT 工具-基礎實戰教程. YAKIT(Yak Integrated Toolkit)是一款基于Yak語言開發的集成化網絡安全單兵工具,旨在覆蓋滲透測試全流程,提供從信息收集、漏洞掃描到攻擊實施的自動化支持。其核心目標是通過GUI界面降低Yak語言的使用…

CRISPR spacers數據庫;CRT和PILER-CR用于MAGs的spacers搜索

iPHoP:病毒宿主預測-CSDN博客 之前介紹了這個方法來預測病毒宿主,今天來介紹另一種比較用的多的方法CRISPR比對 CRISPR spacers數據庫 Dash 在這可以下載作者搜集的spacers用于后期比對 CRT和PILER-CR 使用 CRT 和 PILERCR 識別 CRISPR 間隔區&#x…

模糊聚類分析方法:從模糊等價矩陣到動態分類

一、模糊聚類分析的核心思想 在實際工程技術和經濟管理問題中,我們常常需要對對象進行分類。例如,根據生物特征對物種分類、根據氣候特征對城市分類、根據用戶行為對客戶群體分類等。傳統的聚類分析基于清晰的分類邊界,但現實中許多分類問題…

DeepSeek從入門到精通:提示詞設計的系統化指南

目錄 引言:AIGC時代的核心競爭力 第一部分 基礎篇:提示詞的本質與核心結構 1.1 什么是提示詞? 1.2 提示詞的黃金三角結構 第二部分 類型篇:提示詞的六大范式 2.1 提示語的本質特征 2.2 提示語的類型 2.2.1 指令型提示詞 …

【EDA學習】嘉立創題庫

一、多選題 1.嘉立創題庫的作用是什么,以下描述正確的是? A.提供學習平臺,幫助客戶了解嘉立創工藝 B.可成為嘉立創客戶所在企業的內部培訓資料,打通設計與制造,提高產品研發效率,降本增效 C.可成為嘉立創客…

Python PyCharm DeepSeek接入

Python PyCharm DeepSeek接入 創建API key 首先進入DeepSeek官網,https://www.deepseek.com/ 點擊左側“API Keys”,創建API key,輸出名稱為“AI” 點擊“創建",將API key保存,復制在其它地方。 在PyCharm中下…

對界面簡單易用封裝SDK

1.三大接口 1.CheckTuple package com.x.globalcommonservice.model.permissioncontrolservice.openfga.service;import com.x.globalcommonservice.global.exception.CodeException; import com.x.globalcommonservice.model.permissioncontrolservice.openfga.dto.tuple.Op…

【Pico】使用Pico進行無線串流搜索不到電腦

使用Pico進行無線串流搜索不到電腦 官串方式:使用Pico互聯連接電腦。 故障排查 以下來自官方文檔 請按照以下步騾排除故障: 確認電腦和一體機連接了相同的路由器WiFi網絡(相同網段) IP地址通常為192.168.XX,若兩設備的IP地址前三段相同&…

[免費]Springboot+Vue醫療(醫院)掛號管理系統【論文+源碼+SQL腳本】

大家好,我是java1234_小鋒老師,看到一個不錯的SpringbootVue醫療(醫院)掛號管理系統,分享下哈。 項目視頻演示 【免費】SpringBootVue醫療(醫院)掛號管理系統 Java畢業設計_嗶哩嗶哩_bilibili 項目介紹 在如今社會上,關于信息上…

【一文讀懂】WebRTC協議

WebRTC(Web Real-Time Communication)協議 WebRTC(Web Real-Time Communication)是一種支持瀏覽器和移動應用程序之間進行 實時音頻、視頻和數據通信 的協議。它使得開發者能夠在瀏覽器中實現高質量的 P2P(點對點&…

沃德校園助手系統php+uniapp

一款基于FastAdminThinkPHPUniapp開發的為校園團隊提供全套的技術系統及運營的方案(目前僅適配微信小程序),可以更好的幫助你打造自己的線上助手平臺。成本低,見效快。各種場景都可以自主選擇服務。 更新日志 V1.2.1小程序需要更…

Linux 系統上以 root 用戶身份運行 ./mysql.server start 命令,但仍然收到 “Permission denied” 錯誤

如圖 1 所示,當在 Linux 系統上以 root 用戶身份運行 ./mysql.server start 命令,但仍然收到 “Permission denied” 錯誤時,這通常不是由于權限不足(因為您已經是 root 用戶),而可能是由于 mysql.server 腳…

Android的Activity生命周期知識點總結,詳情

一. Activity生命周期 1.1 返回棧知識點 二. Activity狀態 2.1 啟動狀態 2.2 運行狀態 2.3 暫停狀態 2.4 停止狀態 2.5 銷毀狀態 三. Activity生存期 3.1 回調方法 3.2 生存期 四. 體驗Activity的生命周期 五. Activity被回收辦法 引言: 掌握Acti…

Python----PyQt開發(PyQt基礎,環境搭建,Pycharm中PyQttools工具配置,第一個PyQt程序)

一、QT與PyQT的概念和特點 1.1、QT QT是一個1991年由The Qt Company開發的跨平臺C圖形用戶界面應用程序開發 框架,可構建高性能的桌面、移動及Web應用程序。也可用于開發非GUI程序,比如 控制臺工具和服務器。Qt是面向對象的框架,使用特殊的代…

win10 系統 自定義Ollama安裝路徑 及模型下載位置

win10 系統 自定義Ollama安裝路徑 及模型下載位置 由于Ollama的exe安裝軟件雙擊安裝的時候默認是在C盤,以及后續的模型數據下載也在C盤,導致會占用C盤空間,所以這里單獨寫了一個自定義安裝Ollama安裝目錄的教程。 Ollama官網地址&#xff1…

微軟官方出品GPT大模型編排工具:7個開源項目

今天一起盤點下,12月份推薦的7個.Net開源項目(點擊標題查看詳情)。 1、一個瀏覽器自動化操作的.Net開源庫 這是一個基于 Google 開源的 Node.js 庫 Puppeteer 的 .NET 開源庫,方便開發人員使用無頭 Web 瀏覽器抓取 Web、檢索 Ja…