js 事件流程

JavaScript是单线程的,它使用事件循环处理异步任务。当遇到异步操作时,任务会被放入任务队列。主线程执行完同步代码后,会检查任务队列,先执行微任务,再执行宏任务。例如,setTimeout会被放入宏任务队列,Promise的then属于微任务。给定的代码示例展示了这个执行顺序。
摘要由CSDN通过智能技术生成

描述

  • JavaScript 的执行是单线程的,后面的任务需要等待前面的任务完全完成后,再去执行。
  • DOM 事件(文件的加载等)、定时器、网络请求等事件,并不会消耗 CPU,这些事件无需等候,所以出现了异步。
  • 主线程进行中,将异步事件交给专有模块去处理,当主线程完成后,再去读取异步事件归并到主线程进行处理。

事件流程

  1. 主线程读取代码,形成响应的堆和任务栈
  2. 遇到异步的时候,将事件加入到任务队列
  3. 主线程执行完毕后,查询任务队列,执行队列中的事件
  4. 按顺序,先执行微任务
  5. 再次读取任务队列,如果不再有微任务,开始按顺序执行宏任务
  6. 队列执行完毕

在这里插入图片描述

let timeOut1 = setTimeout(()=>{
    console.log('1');
    let promise1 = new Promise(function (resolve, reject) {
        console.log('2');
        let timeOut2 = setTimeout(()=>{
            console.log('3')
        }, 0);
        resolve();
    }).then(function () {
        console.log('4')
    })
}, 0);
console.log('5');
let timeOut3 = setTimeout(()=>{
    console.log('6')
}, 0)
async function func1(){
    console.log('7');
    await func2();
    console.log('8');
}
function func2(){
    console.log('9');
}
func1();
let promise2 = new Promise(function (resolve, reject) {
    console.log('10');
    resolve();
}).then(function () {
    console.log('11');
}).catch(function () {
    console.log('12');
})
console.log('13')
// 5 7 9 10 13 8 11 1 2 4 6 3
  1. 将 timeOut1 加入任务队列 A
  2. 主线程,打印 5
  3. 将 timeOut3 加入任务队列 A
  4. 主线程,执行 func1,打印 7
  5. 执行 func2,打印 9
  6. 将 await 定义域内后面的事件统一添加到任务队列 A
  7. 主线程,执行 promise2,打印 10
  8. 将 promise2.then 添加到任务队列 A
  9. 主线程,打印 13
  10. 当前主线程执行完毕,开始读取任务队列 A
  11. 当前任务队列 A:timeOut1、timeOut3、await、promise2.then
  12. 先执行微任务,后执行宏任务
  13. 执行 await,打印 8
  14. 当前任务队列 A:timeOut1、timeOut3、promise2.then
  15. 执行 promise2.then,打印 11
  16. 当前任务队列 A:timeOut1、timeOut3
  17. 任务队列 A,所有微任务执行完毕,开始按顺序执行宏任务
  18. 执行 timeOut1,打印 1
  19. 执行 promise1,打印 2
  20. 将 timeOut2 加入任务队列 A
  21. 将 promise1.then 加入任务队列 A
  22. 当前任务队列 A:timeOut3、timeOut2、promise1.then
  23. 先执行微任务,后执行宏任务
  24. 执行 promise1.then,打印 4
  25. 当前任务队列 A:timeOut3、timeOut2
  26. 任务队列 A,所有微任务执行完毕,开始按顺序执行宏任务
  27. 执行 timeOut3,打印 6
  28. 执行 timeOut2,打印 3
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值