-
Notifications
You must be signed in to change notification settings - Fork 3.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
第 25 题:浏览器和Node 事件循环的区别 #26
Comments
其中一个主要的区别在于浏览器的event loop 和nodejs的event loop 在处理异步事件的顺序是不同的,nodejs中有micro event;其中Promise属于micro event 该异步事件的处理顺序就和浏览器不同.nodejs V11.0以上 这两者之间的顺序就相同了. |
为楼上补充一个例子
function test () {
console.log('start')
setTimeout(() => {
console.log('children2')
Promise.resolve().then(() => {console.log('children2-1')})
}, 0)
setTimeout(() => {
console.log('children3')
Promise.resolve().then(() => {console.log('children3-1')})
}, 0)
Promise.resolve().then(() => {console.log('children1')})
console.log('end')
}
test()
// 以上代码在node11以下版本的执行结果(先执行所有的宏任务,再执行微任务)
// start
// end
// children1
// children2
// children3
// children2-1
// children3-1
// 以上代码在node11及浏览器的执行结果(顺序执行宏任务和微任务)
// start
// end
// children1
// children2
// children2-1
// children3
// children3-1 |
题目应该是:浏览器和node的事件循环的区别吧, 先上链接: 第一个链接里面大佬讲的已经非常透彻了我来总结一下。 浏览器关于微任务和宏任务在浏览器的执行顺序是这样的:
如此循环往复下去
NodeNode的事件循环是libuv实现的,引用一张官网的图: 大体的task(宏任务)执行顺序是这样的:
微任务和宏任务在Node的执行顺序 Node 10以前:
Node 11以后: |
Node 官方文档从始至终到没有提到微任务和宏任务的概念。 之所以会出现 Node 10 和 Node 11 的异步执行差异,可以看官方文档 Deduplication 这一节内容,以及 Node 11 的 PR,TLDR 在 Node 11 之后是为了消除和浏览器执行的差异。 |
大佬,我的理解是:在11之前宏任务中有微任务的,会把微任务仍到微任务的队列,先执行了宏任务中的立即执行方法再去执行微任务。11以后执行宏任务的时候会把自己任务中所有的事儿(除了宏任务)都干完才会执行下个阶段任务,而不会将其中的微任务搁置到微任务队列。这么理解对么。。。 |
nodejs的api事件循环基本都是io多线程异步,而浏览器除了ajax外基本都是非阻塞异步模型 |
实际测试,不管是不是node11还是11以下都是下面的结果 |
node下结果 |
浏览器的EventLoop是将所有的微任务执行完,再执行宏任务,再执行宏任务中所有的微任务,再执行宏任务,再执行宏任务中的所有微任务 node的时间循环是交叉执行,执行完同级的所有timer类, 再执行同级的所有promise.then,再执行所有的同级timer function sleep(time) {
let startTime = new Date();
while (new Date() - startTime < time) {}
console.log('<--Next Loop-->');
}
宏任务1-setTimeout(() => {
console.log('宏任务timeout1-一级');
宏任务3-setTimeout(() => {
console.log('宏任务timeout1-二级');
sleep(1000);
});
new Promise((resolve) => {
console.log('微任务promise1-同步');
resolve();
}).then(() => {
console.log('微任务promise1-异步then');
});
sleep(1000);
});
宏任务2-setTimeout(() => {
console.log('宏任务timeout2-一级');
宏任务4-setTimeout(() => {
console.log('宏任务timeout2-二级');
sleep(1000);
});
new Promise((resolve) => {
console.log('微任务promise2-同步');
resolve();
}).then(() => {
console.log('微任务promise2-异步then');
});
sleep(1000);
}); 浏览器执行结果:
// 浏览器输出结果
宏任务timeout1-一级
微任务promise1-同步
<--Next Loop-->
微任务promise1-异步then
宏任务timeout2-一级
微任务promise2-同步
<--Next Loop-->
宏任务timeout1-二级
<--Next Loop-->
宏任务timeout2-二级
<--Next Loop--> node执行结果:
// node11以下执行
宏任务timeout1-一级
微任务promise1-同步
<--Next Loop-->
宏任务timeout2-一级
微任务promise2-同步
<--Next Loop-->
微任务promise1-异步then
微任务promise2-异步then
宏任务timeout1-二级
<--Next Loop-->
宏任务timeout2-二级
<--Next Loop--> |
@Liubasara Promise.resolve().then(() => {console.log('children1')}) 这个是微任务吧????怎么能说: 以上代码在node11以下版本的执行结果(先执行所有的宏任务,再执行微任务)?????请指教?? |
用n切版本的时候,刚切换完跑确实是这样的,我执行了一下node -v,显示确实切换成功了,再跑一次就变了 |
文章解释挺清楚了,setTimeout设置0回调其实并不能精确到0的,时间在0-1之间
|
所以没区别了是吗 |
No description provided.
The text was updated successfully, but these errors were encountered: