发布于 2024 年 2 月 26 日,星期一
浏览器和Node.js中的宏任务和微任务是异步编程的核心概念。宏任务通常包括整体代码块、setTimeout、setInterval等,它们在事件循环的下一轮执行。微任务则包括Promise的回调、process.nextTick等,它们在当前任务完成后立即执行,确保在宏任务之前处理。理解这两者的区别和执行顺序,有助于优化异步代码的性能和避免潜在的并发问题。
极度投入,深度沉浸,边界清晰
前端小菜鸡一枚,分享的文章纯属个人见解,若有不正确或可待讨论点可随意评论,与各位同学一起学习~
欢迎关注
『非同质前端札记』
公众号 ,一起探索学习前端技术......公众号回复
加群
或扫码
, 即可加入前端交流学习群,长期交流学习......公众号回复
加好友
,即可添加为好友
script中的代码,setTimeout, setInterval, I/O, UI render
promise(async/await), Object.observe, MutationObserver
setTimeout,setInterval,setImmediate,script 整体代码, I/O 操作
process.nextTick,new Promise().then()
// eg1:
console.log(1);
setTimeout(() => console.log(2));
Promise.resolve().then(() => console.log(3));
Promise.resolve().then(() => setTimeout(() => console.log(4)));
Promise.resolve().then(() => console.log(5));
setTimeout(() => console.log(6));
console.log(7);
// 同步任务:
// console.log(1);
// console.log(7);
// 宏任务:
// setTimeout(() => console.log(2));
// setTimeout(() => console.log(6));
// setTimeout(() => console.log(4)))
// 微任务:
// Promise.resolve().then(() => console.log(3));
// Promise.resolve().then(() => setTimeout(() => console.log(4)));
// Promise.resolve().then(() => console.log(5));
/**
* 结果:1 7 3 5 2 6 4
* 解析:
* 第一轮开始:
* 1. 同步任务 console.log(1); => 1
* 2. 遇到宏任务,加入宏任务队列
* 3. 遇到微任务,加入微任务队列
* 4. 遇到微任务,加入微任务队列
* 5. 遇到微任务,加入微任务队列
* 6. 遇到宏任务,加入宏任务队列
* 7. 同步任务 console.log(7); => 7
宏任务:
setTimeout(() => console.log(2));
setTimeout(() => console.log(6));
微任务:
Promise.resolve().then(() => console.log(3));
Promise.resolve().then(() => setTimeout(() => console.log(4)));
Promise.resolve().then(() => console.log(5));
* 第一轮结果: 1 7
* 第二轮开始:
* 1. 执行微任务,取出队列中的第一项:console.log(3)); => 3
* 2. 执行微任务,取出队列中的第二项,此时遇到宏任务 setTimeout(() => console.log(4)) 加入到宏任务队列
* 3. 执行微任务,取出队列中的第三项:console.log(5)); => 5
* 4. 此时微任务队列为空,执行宏任务队列第一项:setTimeout(() => console.log(2)); => 2
* 5. 此时微任务队列为空,执行宏任务队列第二项:setTimeout(() => console.log(6)); => 6
* 6. 此时微任务队列为空,执行宏任务队列第三项:setTimeout(() => console.log(4)); => 4
* 7. 此时所有任务执行完,返回结果
宏任务:
setTimeout(() => console.log(2));
setTimeout(() => console.log(6));
setTimeout(() => console.log(4));
微任务:
empty
* 第二轮结果:1 7 3 5 2 6 4
最终结果:1 7 3 5 2 6 4
*/
// eg2:
setImmediate(function A() {
console.log(10);
setImmediate(function B() {
console.log(11);
});
});
console.log(1);
setTimeout(() => console.log(2));
Promise.resolve().then(() => console.log(3));
Promise.resolve().then(() => setTimeout(() => console.log(4)));
Promise.resolve().then(() => console.log(5));
setTimeout(() => console.log(6));
process.nextTick(function A() {
console.log(8);
process.nextTick(function B() {
console.log(9);
});
});
console.log(7);
/**
* 过程省略.....
*/
// 1 7 8 9 3 5 2 6 4 10 11
Q:(question)
R:(result)
A:(attention matters)
D:(detail info)
S:(summary)
Ana:(analysis)
T:(tips)
『非同质前端札记』
公众号 ,一起探索学习前端技术......加群
或 扫码
, 即可加入前端交流学习群,长期交流学习......加好友
,即可添加为好友