Skip to content
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

浏览器和 Node 事件循环的区别 #16

Open
lovelmh13 opened this issue Jan 31, 2020 · 0 comments
Open

浏览器和 Node 事件循环的区别 #16

lovelmh13 opened this issue Jan 31, 2020 · 0 comments

Comments

@lovelmh13
Copy link
Owner

lovelmh13 commented Jan 31, 2020

原题

关于浏览器的事件循环 ,在我以前的笔记里有,就不再重复说了。

Node的事件循环,在v11版本以后,与浏览器一致。

在v11之前的区别在于,Node的事件循环,会执行完本阶段所有的宏任务,再执行所有的微任务,再执行本阶段所有的宏任务, 执行所有的微任务。而浏览器则是执行一个宏任务,执行所有的微任务

Node大体的task(宏任务)执行顺序是这样的:
timers定时器:本阶段执行已经安排的 setTimeout() 和 setInterval() 的回调函数。
pending callbacks待定回调:执行延迟到下一个循环迭代的 I/O 回调。
idle, prepare:仅系统内部使用。
poll 轮询:检索新的 I/O 事件;执行与 I/O 相关的回调(几乎所有情况下,除了关闭的回调函数,它们由计时器和 setImmediate() 排定的之外),其余情况 node 将在此处阻塞。
check 检测:setImmediate() 回调函数在这里执行。
close callbacks 关闭的回调函数:一些准备关闭的回调函数,如:socket.on('close', ...)。

Node 10以前:
执行完一个阶段的所有任务
执行完nextTick队列里面的内容
然后执行完微任务队列的内容

打印一下就知道:

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
@lovelmh13 lovelmh13 changed the title 浏览器和Node 事件循环的区别 浏览器和 Node 事件循环的区别 Jan 31, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant