事件循环和任务队列
- 浏览器中展现如下
程序执行时,先执行主程序,执行主程序时。如果发现有setTimeout或者setInterval,或者发送http请求等,这些异步的代码就会创建其他的异步对象,只是创建对象但是暂不执行。
定时器:当定时器等待时间结束时,回调函数自动执行
小黄人:xhr.onreadyStatechang
e,当响应结果回来时自动执行
当他们满足执行条件时,都不能立刻进入主线程执行,而是进入了任务队列/回调队列
当主线程空了的时候,事件循环一直盯着主线程,就从任务队列中按顺序取出回调函数。队列这里,是先进的回调函数先执行,后进的回调函数后执行
promise比较特殊
promise中的then不会进入到异步对象中创建,then会进入任务队列中的微任务。所有promise中的then的回调函数都会进入微任务中等待执行。
then中的回调函数会比其他的异步操作提前执行
面试题
setTimeout(()=>console.log('a'),0)
var p=new Promise(resolve=>{
console.log('b')
resolve()
})
p.then(()=>{console.log('c')})
console.log('e')
/// 结果是b e c a
- 在node中
node中多一个process.nextTick,process.nextTick进入微队列,且优先级高于then
process.nextTick(()=>{console.log(9)})
new Promise((resolve)=>{
console.log(3)
resolve()
console.log(4)
}).then(function(){
console.log(6)
})
process.nextTick(function(){
console.log(7)
})
// 结果是 3 4 9 7 6