简述异步线程、轮询机制、宏任务微任务
在 JavaScript 中,异步编程是其核心特性之一。为了更好地理解异步编程,需要掌握以下几个概念:异步线程、轮询机制、宏任务和微任务。
1. 异步线程
-
定义:
- JavaScript 是单线程语言,但浏览器或 Node.js 提供了多线程能力(如 Web Workers、Node.js 的
worker_threads)。
- JavaScript 是单线程语言,但浏览器或 Node.js 提供了多线程能力(如 Web Workers、Node.js 的
-
作用:
- 将耗时的任务(如网络请求、文件读写)放到异步线程中执行,避免阻塞主线程。
// 使用 Web Workers 创建异步线程
const worker = new Worker('worker.js');
worker.postMessage('Start');
worker.onmessage = function(event) {
console.log('Received:', event.data);
};
2. 轮询机制
-
定义:
- 轮询机制是事件循环(Event Loop)的核心,用于检查任务队列中是否有待执行的任务。
-
工作流程:
-
执行同步任务。
-
检查微任务队列,执行所有微任务。
-
检查宏任务队列,执行一个宏任务。
-
重复上述步骤。
-
console.log('Start'); // 同步任务
setTimeout(() => console.log('Timeout'), 0); // 宏任务
Promise.resolve().then(() => console.log('Promise')); // 微任务
console.log('End'); // 同步任务
// 输出顺序: Start → End → Promise → Timeout
3. 宏任务(Macro Task)
-
定义:
-
宏任务是较大的任务单元,通常包括:
-
setTimeout、setInterval -
I/O 操作(如文件读写、网络请求)
-
UI 渲染
-
-
-
特点:
- 每次事件循环只执行一个宏任务。
setTimeout(() => console.log('Timeout'), 0);
4. 微任务(Micro Task)
-
定义:
-
微任务是较小的任务单元,通常包括:
-
Promise的回调(then、catch、finally) -
MutationObserver -
queueMicrotask
-
-
-
特点:
-
每次事件循环会执行所有微任务。
-
微任务的优先级高于宏任务。
-
Promise.resolve().then(() => console.log('Promise'));
5. 事件循环(Event Loop)
-
定义:
- 事件循环是 JavaScript 实现异步编程的核心机制,负责调度宏任务和微任务。
-
工作流程:
-
执行同步任务。
-
检查微任务队列,执行所有微任务。
-
检查宏任务队列,执行一个宏任务。
-
重复上述步骤。
-
console.log('Start'); // 同步任务
setTimeout(() => console.log('Timeout'), 0); // 宏任务
Promise.resolve().then(() => console.log('Promise')); // 微任务
console.log('End'); // 同步任务
// 输出顺序: Start → End → Promise → Timeout
总结
| 概念 | 描述 | 示例 |
|---|---|---|
| 异步线程 | 将耗时任务放到异步线程中执行 | Web Workers、Node.js 的 worker_threads |
| 轮询机制 | 事件循环的核心,检查任务队列 | 事件循环的工作流程 |
| 宏任务 | 较大的任务单元,每次执行一个 | setTimeout、setInterval |
| 微任务 | 较小的任务单元,每次执行所有 | Promise、MutationObserver |
理解异步线程、轮询机制、宏任务和微任务的关系,有助于更好地掌握 JavaScript 的异步编程模型。
更多vue相关插件及后台管理模板可访问vue admin reference,代码详情请访问github