先上码子:
console.log(11);
setTimeout(() => {
console.log(2);
Promise.resolve().then(() => {
console.log(3)
});
});
new Promise((resolve, reject) => {
console.log(4)
resolve(5)
}).then((data) => {
console.log(data);
Promise.resolve().then(() => {
console.log(6)
}).then(() => {
console.log(7)
setTimeout(() => {
console.log(8)
}, 0);
});
})
setTimeout(() => {
console.log(9);
})
console.log(10);
// 结果:11、4、10、5、6、7、2、3、9、8
js事件循环、同步异步:
首先,js任务执行的是单线程的,得按顺序来,后续的任务得等排队(任务队列)等着。
但是任务分为同步和异步。当一个任务块代码执行时,
遇到同步任务,就会进入主线程,
遇到异步任务会进入事件表中注册函数,之后将函数移入到事件队列中。
主线程内任务执行完毕,会去事件队列读取异步函数,按照顺序执行异步函数
js事件循环、宏任务微任务:
js事件还可以分为宏任务微任务:macro-task(宏任务):包括整体代码script,setTimeout,setInterval micro-task(微任务):
Promise,process.nextTick
当一个宏任务进入主线程:
判断这个任务是同步异步,同步执行
异步宏任务,放在 事件队列 , 异步微任务,放在 事件队列
当主线程任务执行完毕,去事件队列
进入事件队列,判断是微任务还是宏任务,先执行微任务,再执行宏任务