单线程
js是单线程,为了防止一个函数执行时间过长阻塞后面的代码。会先将同步代码放入执行栈中,再执行nextTick,再将异步代码加入异步队列中,异步队列分为微队列(Promise.then),宏队列(setTimeout ,setInterval,ajax,读取文件),然后再setImmediate
js执行步骤
- 同步(promise内部的执行也是同步)
- process.nextTick
- 微任务(Promise.then)
- 宏任务(setTimeout ,setInterval,ajax,读取文件)
- setImmediate(计数器放在运行栈内,第一次栈内的事情循环加载完后就会触发)
例子:
setImmediate(()=>{
console.log(1)
})
console.log(2)
setTimeout(()=>{console.log(3)},0)//第一次放入任务队列中,事件循环加载,然后走setImmediate
setTimeout(()=>{console.log(4)},100)//100毫秒后第二次放入任务队列中,所以这个打印在setImmediate后
console.log(5)
new Promise((resolve)=>{
console.log(6) // 同步
resolve() // 加这个,promise才会走then方法
}).then(()=>{
console.log(7)
})
process.nextTick(()=>{
console.log(8)
})
输出:2、5、6、8、7、3、1、4