eventloop 事件循环笔记

本文内容是学习以下2篇文章的笔记

https://juejin.im/post/5a6155126fb9a01cb64edb45

https://juejin.im/post/59e85eebf265da430d571f89

monitoring process进程不断检查主线程是否为空,为空的话就去执行Event Queue里面等待被调用的函数

settimeout(function() {

task();

},3)

sleep(1000000);

1.task进入EventTable并注册,计时开始

2.执行sleep,很慢,计时器仍在继续

3.3s到了,计时事件timeout完成,task进入Event Queue但是sleep还没完,继续等待

4.sleep执行完了,task进入主线程执行。

settimeout在指定时间后将要执行的任务加入Event Queue,又因为单线程任务要一个一个执行,如果前面的任务耗时太久就只能等着,导致延时超过3s。

settimeout(fn,0) 指定某个任务在主线程最早可得的空闲时间执行,意思是不用等多少秒了,主线程执行栈内所有同步任务全部执行完成了,栈为空就马上执行

ps:即使主线程为空,0ms也是达不到的,最低4ms (尚未验证)

setinterval(fn,ms)不是没过ms秒就会执行一次,而是没过ms秒将fn置入Event Queue,如果前面任务耗时太久仍需等待

注意:一旦回调fn的执行时间超过延迟时间,那么就完全看不出有时间间隔了

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

process.nextTick(fn) 类似于node版本的settimeout,在事件循环的下一次循环中调用fn回调函数

macro-task宏任务:整体代码script,settimeout,setinterval (new Promise也包括)

micro-task微任务:promise,process.nextTick

事件循环的顺序决定了js的执行顺序,进入整体代码(宏任务)后开始第一次循环,接着执行所有的微任务,然后再次从宏任务开始,找到其中一个队列执行完再执行所有的微任务

console.log('1');

setTimeout(function() {
console.log('2');
process.nextTick(function() {
console.log('3');
})
new Promise(function(resolve) {
console.log('4');
resolve();
}).then(function() {
console.log('5')
})
})
process.nextTick(function() {
console.log('6');
})
new Promise(function(resolve) {
console.log('7');
resolve();
}).then(function() {
console.log('8')
})

setTimeout(function() {
console.log('9');
process.nextTick(function() {
console.log('10');
})
new Promise(function(resolve) {
console.log('11');
resolve();
}).then(function() {
console.log('12')
})
})

答案:

猜你喜欢

转载自www.cnblogs.com/miraclesakura/p/10103340.html