事件循环机制在两种环境下是不同的,我们来简单讲讲
浏览器端
首先浏览器会把主任务队列(同步任务)中的同步任务挨个全部执行完,
然后再去等待任务队列(异步任务)中看哪个任务可以执行了,
然后把该执行的任务放到主任务队列中去执行,
等这个任务执行完,再去等待任务中看谁可以执行了,再把这个任务放到主任务队列中执行... 如此循环。这种循环叫做事件循环(Event Loop)
宏任务和微任务
宏任务和微任务是等待任务队列中的异步任务的处理机制;(JS执行有同步任务队列和等待任务队列)
主任务队列存储的都是同步任务;等待任务队列存储的都是异步任务;
异步任务都是谁先到达条件谁先执行,微任务的优先级比宏任务的要高;
哪些是宏任务:
\1. 定时器(setInterval和setTimeout)
\2. DOM事件回调
\3. ajax回调 ajax达到执行条件就会立即执行
哪些是微任务:
\1. Promise的then的回调函数
\2. async 函数await下面的代码;
\3.MutationObserver的回调
\4. process.nextTick
nodejs
\1. timers 阶段: 这个阶段执行 setTimeout(callback)
和 setInterval(callback)
预定的 callback;
\2. I/O callbacks 阶段: 此阶段执行某些系统操作的回调,例如TCP错误的类型。 例如,如果TCP套接字在尝试连接时收到 ECONNREFUSED,则某些* nix系统希望等待报告错误。 这将操作将等待在==I/O回调阶段==执行;
\3. idle, prepare 阶段: 仅node内部使用;
\4. poll 阶段: 获取新的I/O事件, 例如操作读取文件等等,适当的条件下node将阻塞在这里;
\5. check 阶段: 执行 setImmediate()
设定的callbacks;
\6. close callbacks 阶段: 比如 socket.on(‘close’, callback)
的callback会在这个阶段执行;