接昨天代码输出题目,前端面试题之代码输出前端面试题之代码输出
异步&事件循环
3.代码输出结果
const promise = new Promise((resolve, reject) => {
console.log(1);
setTimeout(() => {
console.log("timerStart");
resolve("success");
console.log("timerEnd");
}, 0);
console.log(2);
});
promise.then((res) => {
console.log(res);
});
console.log(4);
输出结果如下:
1
2
4
timerStart
timerEnd
success
代码执行顺序如下:
- 首先遇到
new Promise
,打印 1; - 遇到
setTimout
,宏任务,放到宏任务队列; - 继续向下执行,打印 2;
- 由于
Promise
的状态是pending
,跳过promise.then
,打印4; - 微任务队列没有热舞,继续执行下一轮宏任务,执行
setTimeout
; - 首先打印
timerStart
,遇到resolve
,将promise的状态改为fulfilled
,然后将promise.then
推入微任务,打印timerEnd
; - 最后执行微任务
promise.then
,打印success
。
4.代码输出结果
Promise.resolve().then(() => {
console.log('promise1');
const timer2 = setTimeout(() => {
console.log('timer2')
}, 0)
});
const timer1 = setTimeout(() => {
console.log('timer1')
Promise.resolve().then(() => {
console.log('promise2')
})
}, 0)
console.log('start');
输出结果如下:
start
promise1
timer1
promise2
timer2
代码执行顺序如下:
- 首先,
Promise.resolve().then()
是微任务,推入微任务队列, timer1
是宏任务,推入宏任务队列- 继续执行,打印
start
- 开始执行微任务
Promise.resolve().then()
,打印promise1
- timer2是宏任务,推入宏任务队列
- 开始执行宏任务,执行
timer1
,打印timer1
Promise.resolve().then()
推入微任务队列- 执行微任务队列,打印
promise2
- 最后执行宏任务队列的
timer2
,打印timer2