setTimeout(() => { console.log(1) }, 1000)
new Promise(resolve => {
setTimeout(() => { resolve(2) }, 1000)
}).then(data => {
console.log(data); // 我主要不清楚then属于哪次事件循环
});
console.log(3)
请问上面一共有几次事件循环?then属于哪一次事件循环?每次事件循环都打印什么?对比下面这个事例。
new Promise(resolve => {
console.log('1');
for(var i = 0; i < 1000; i++) {
i == 99 && resolve();
}
console.log('2');
}).then(function() {
console.log('3');
})
console.log(4)
这个事例是只有一个事件循环,then是属于第1个事件循环中的微任务
事件循环是指一个机制,里面分为宏任务和微任务。上面这个代码开始执行,遇到setTimeout会把回调函数放入宏任务队列,遇到new Promise, 会先执行构造函数里的方法,也就是
setTimeout(() => { resolve(2) }, 1000)
, 同样会把这个回调函数放入宏任务队列,然后执行console.log(3)
, 输出3, 接着先执行微任务队列,发现里面没有任务,结束。至此,一次循环完成。然后开始下一轮循环,执行宏任务中的代码,也就是console.log(1)
,输出1,然后扫描微任务,发现没有,结束。然后开始第三次循环,执行宏任务,也就是resolve(2)
,此时会把then方法也就是console.log(data);
加入promise任务源,然后执行微任务,输出2。所以一共循环3次,输出 3 ,隔1秒,输出 1 ,2