Js运行机制(单线程)
运行栈 任务队列 事件循环 轮询执行任务队列
------------- -------------- 《------|
| 同步 | | 异步 | |
------------- -------------- |-------
微任务:promise.then
宏任务:计时器 ajax 读取文件
执行顺序
1. 同步
2. process.nextTick
3. 微任务
4. 宏任务/setImmediate
- 首先同步代码会放到 运行栈执行
- 之后异步的代码比如计时器,到了时间 会放入到任务队列中,事件循环会每隔一段时间,轮询运行任务队列的代码.
(计时器的时间不准的原因,他需要同步的代码执行之后,然后在靠事件循环机制运行)
- setImmediate 触发的机制是 当前事件循环结束.
(测试了一下 setTimeout 0毫秒和1毫秒时 setImmediate后触发
setTimeout 大于1毫秒时 setImmediate先触发)
附带一道题
console.log('同步1')
process.nextTick(()=>{
console.log('nextTick');
})
setTimeout(()=>{
console.log('异步1');
},0)
setTimeout(()=>{
console.log('异步2');
},10)
async()
console.log('同步2');
setImmediate(()=>{
console.log('setImmediate');
})
new Promise((resolve)=>{
// new Promise时 是同步代码
console.log('Promise');
resolve()
}).then(()=>{
console.log('Promise.then',);
}).then(()=>{
console.log('Promise.then2',);
})
new Promise((resolve)=>{
// new Promise时 是同步代码
console.log('Promise2');
resolve()
}).then(()=>{
console.log('Promise.then3',);
}).then(()=>{
console.log('Promise.then4',);
})
async function async() {
console.log('await前',);
await async2()
// await后面的属于微任务
console.log('async')
console.log('await后')
}
console.log('同步3')
async function async2() {
console.log('async2')
}
答案分割线
同步1
await前
async2
同步2
Promise
Promise2
同步3
nextTick
async
await后
Promise.then
Promise.then3
Promise.then2
Promise.then4
异步1
setImmediate
异步2
如果🈶️小伙伴喜欢,要一键三连哦~~~ (´๑•_•๑)