JavaScript宏任务微任务问题setTimeout和Promise

小刘
  • 526
let count = 10000;
setTimeout(function(){
    console.log('1')
}, 0);
new Promise(function(resolve){
    console.log('2');
    for(var i=0;i<count;i++){
        if(i === 10) {console.log(10)}
i == 9999 && resolve();
    }
}).then(function(){
    console.log('3')
});
console.log('5');

为什么是先输出3然后才输出1

回复
阅读 928
4 个回答

因为宏任务执行前必须先清空微任务列表,而3是微任务,1是宏任务。另外,微任务的套娃会不断阻碍宏任务的执行,众所周知,定时器的秒数是一个模糊的时间,是指x秒后浏览器空闲时执行,而0秒就更是一个模糊的概念,因为定时器有个最小时间间隔,有的浏览器是2s,有的是4s

就像打工。
promise.then安排的任务就是不管你今天下班多晚都得干完再下班;而setTimeout安排的任务就是最快也得明天做。

宣传栏