前端面试题之代码输出(二)
  FTKwE7sqlksi 2023年11月02日 46 0

接昨天代码输出题目,前端面试题之代码输出前端面试题之代码输出

异步&事件循环

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

代码执行顺序如下:

  1. 首先遇到 new Promise ,打印 1;
  2. 遇到 setTimout,宏任务,放到宏任务队列;
  3. 继续向下执行,打印 2;
  4. 由于 Promise 的状态是 pending ,跳过 promise.then,打印4;
  5. 微任务队列没有热舞,继续执行下一轮宏任务,执行 setTimeout
  6. 首先打印 timerStart ,遇到 resolve,将promise的状态改为 fulfilled,然后将 promise.then 推入微任务,打印 timerEnd
  7. 最后执行微任务 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

代码执行顺序如下:

  1. 首先,Promise.resolve().then() 是微任务,推入微任务队列,
  2. timer1 是宏任务,推入宏任务队列
  3. 继续执行,打印 start
  4. 开始执行微任务Promise.resolve().then() ,打印 promise1
  5. timer2是宏任务,推入宏任务队列
  6. 开始执行宏任务,执行timer1 ,打印 timer1
  7. Promise.resolve().then() 推入微任务队列
  8. 执行微任务队列,打印 promise2
  9. 最后执行宏任务队列的 timer2 ,打印 timer2
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
FTKwE7sqlksi