执行以下代码,输出结果为()
console.log(1);
let a = setTimeout(() => {console.log(2)}, 0);
console.log(3);
Promise.resolve(4).then(b => {
console.log(b);
clearTimeout(a);
});
console.log(5);
promise对象的then()方法属于微任务,而setTimeout()定时器函数为宏任务。
在执行顺序处理上,js会先执行所有同步代码,然后执行微任务队列中的所有微任务,最后再继续执行宏任务。
在本题中,先执行同步代码并输出1 3 5,接着执行Promise.resolve().then()方法,输出4,由于在then()方法内删除了定时器函数,所以不会再输出2,
最终输出结果为1 3 5 4
主要注意一点异步任务中的宏任务和微任务,微任务执行顺序早于宏任务,promise属于微任务
promise 是微任务,会在当前轮事件循环结束前执行;
setTimeout 是宏任务,在下一轮事件循环执行;
所以这个 setTimeout 设置的定时器被取消掉了
同步→异步→回调
promise是异步微任务,
setTimeout是异步宏任务,
微任务比宏任务先执行,所以取消了定时器回调