js 运行的顺序 同步→异步(微任务→宏任务)
先执行全局的同步代码,在node中从微任务队列中依次取出所有的任务放入调用栈中执行,然后开始宏任务,宏任务队列中的所有任务都取出来执行(在浏览器中,浏览器只取一个,执行完一个宏任务后再执行下一个),每个宏任务阶段执行完毕后,开始执行微任务,再开始执行下一阶段宏任务,以此构成事件循环
-
node中 同步→所有微任务→所有宏任务(同步→所有微任务→所有宏任务)
-
浏览器中 同步→所有微任务→单个宏任务(同步→所有微任务→单个宏任务)
宏任务
一些异步任务的回调会依次进入宏任务队列,等待后续被调用,包括setTimeout setInterval等。
微任务
一些异步任务的回调会依次进入微任务,等待后续被调用,包括process.nextTick (Node独有) Promise.then() Object.observe等。
setTimeout(() => {
console.log(1);
Promise.resolve(3).then(data => console.log(data))
},0);
setTimeout(() => {
console.log(2)
},0)
// node 1 2 3 浏览器 1 3 2
总结
- 定时器宏任务 promise微任务 微任务先执行
- 在浏览器是宏任务单独执行,node中是同时执行的