广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >一篇文章带你了解vue.js的事件循环机制
  • 961
分享到

一篇文章带你了解vue.js的事件循环机制

2024-04-02 19:04:59 961人浏览 薄情痞子
摘要

目录一、事件循环机制介绍       二、经典事件循环面试题总结一、事件循环机制介绍    

一、事件循环机制介绍       

js是单线程的语言,浏览器和node.js定义了各自的Event Loop(事件循环机制)则是用来解决异步问题。将程序分为“主线程(执行栈)”与“Event Loop线程”,“主线程”自上而下依次执行同步任务,“Event Loop线程”将异步任务推入宏任务队列与微任务队列去执行。

事件循环机制从整体上告诉了我们 javascript 代码的执行顺序 Event Loop 即事件循环,是指浏览器或node 的一种解决javaScript 单线程运行时不会阻塞的一种机制,也就是我们经常使用异步的原理。“Event Loop线程”先执行宏任务队列,然后执行微任务队列,若微任务在执行过程中产生了新的微任务,则继续执行微任务,微任务执行完毕后,再回到宏任务中进行下一轮循环。即继续先执行宏任务队列,再执行 微任务队列。

宏任务:

script(整体代码)/setTimeout/setInterval/setImmediate/ I/O / UI Rendering

微任务:

process.nextTick()/Promise/Async、Await(实际就是Promise)/MutationObserver(HTML5新特性)

setTimeout 和 setInterval 等都是任务源,真正进入任务队列的是他们分发的任务。

优先级

setTimeout = setInterval 一个队列setTimeout > setImmediate process.nextTick > Promise

二、经典事件循环面试

1.在下面这段代码是面试中关于这类问题的经典考题,其中包含了同步、异步任务,几个输出的先后顺序是怎样的。

setTimeout(function(){
    console.log('1')
});
new Promise(function(resolve){
    console.log('2');
    resolve();
}).then(function(){
    console.log('3')
});
console.log('4');
// 2,4,3,1

首先进行任务划分,同步任务:new Promise()console.log('4')宏任务setTimeout()微任务Promise().then()Event Loop依次将同步任务推入执行栈并执行,当遇到宏任务或微任务时,推到宏任务或微任务队列中。先执行同步任务,同步队列执行完毕,会去微队列取任务,直到微队列清空,再去宏队列取任务执行。故此段程序执行顺序为:

new Promise()console.log('4')Promise().then()setTimeout()

 2.示例2

 答案输出为:async2 end => Promise => async1 end => promise1 => promise2 => setTimeout

3.示例3

        mounted(){
            this.test();
 
        },
        methods:{
            test(){
                console.log('script start');
 
                this.async1();
 
                setTimeout(function() {
                 console.log('setTimeout')
                }, 0);
 
                new Promise(resolve => {
                    console.log('Promise')
                    resolve()
                })
                .then(function() {
                console.log('promise1')
                })
                .then(function() {
                console.log('promise2')
                })
 
                console.log('script end')
            },
            async async1() {
                await this.async2()
                    console.log('async1 end')
            },
            async async2() {
              console.log('async2 end')
            },
        }

新版的chrome浏览器中不是如上打印的,因为chrome优化了,await变得更快了,输出为:

// script start => async2 end => Promise => script end => async1 end => promise1 => promise2

分析这段代码:

  • 执行代码,输出script start。
  • 执行async1(),会调用async2(),然后输出async2 end,此时将会保留async1函数的上下文,然后跳出async1函数。
  • 遇到setTimeout,产生一个宏任务
  • 执行Promise,输出Promise。遇到then,产生第一个微任务
  • 继续执行代码,输出script end
  • 代码逻辑执行完毕(当前宏任务执行完毕),开始执行当前宏任务产生的微任务队列,输出promise1,该微任务遇到then,产生一个新的微任务 
  • 执行产生的微任务,输出promise2,当前微任务队列执行完毕。执行权回到async1 
  • 执行await,实际上会产生一个promise返回,即
  • let promise_ = new Promise((resolve,reject){ resolve(undefined)})
  • 执行完成,执行await后面的语句,输出async1 end 最后,执行下一个宏任务,即执行setTimeout,输出setTimeout
  • 注意以上分析是旧版浏览器await执行慢导致async1在微任务执行后执行。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: 一篇文章带你了解vue.js的事件循环机制

本文链接: https://www.lsjlt.com/news/141313.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一篇文章带你了解vue.js的事件循环机制
    目录一、事件循环机制介绍       二、经典事件循环面试题总结一、事件循环机制介绍    ...
    99+
    2022-11-13
  • 一篇文章让你搞清楚JavaScript事件循环
    目录前言宏任务微任务事件循环宏任务与微任务总结参考资料前言 异步函数也是有执行顺序的。本质上来说,JavaScript是单线程语言,不管是在浏览器中还是nodejs环境下。浏览器在执...
    99+
    2022-11-13
  • 一篇文章带你了解webscraper爬虫插件
    最近看到很多同学都在研究爬虫,然后我想到了一款尘封已久的插件,很早之前在我刚接触爬虫的时候用过,不过自从上了python爬虫过后,慢慢就搁置了,今天花时间撸一篇教程,给同学们安利这款插件,如果刚开始学爬虫,它一定是你通往人生巅峰的不二人选哦...
    99+
    2023-06-01
  • 一篇文章带你了解Python中的类
    目录1、类的定义2、创建对象3、继承总结1、类的定义 创建一个rectangle.py文件,并在该文件中定义一个Rectangle类。在该类中,__init__表示构造方法。其中,s...
    99+
    2022-11-12
  • 一篇文章带你了解Spring AOP 的注解
    目录1、xml 的方式实现 AOP①、接口 UserService②、实现类 UserServiceImpl③、切面类,也就是通知类 MyAspect④、AOP配置文件 applic...
    99+
    2022-11-13
  • 一篇文章带你了解C语言的文件操作
    目录为什么使用文件什么是文件程序文件数据文件文件名文件的打开和关闭文件指针fopen和fclose函数文件的顺序读写总结为什么使用文件 我们在想既然是通讯录就应该把信息记录下来,只有...
    99+
    2022-11-13
  • 一篇文章带你了解C++的KMP算法
    目录KMP算法步骤1:先计算子串中的前后缀数组NextC++代码:步骤2:查找子串在母串中出现的位置。总结KMP算法 KMP算法作用:字符串匹配 例如母串S = “aaagoogle...
    99+
    2022-11-12
  • 一篇文章带你了解C++中的异常
    目录异常抛出异常基本操作自定义的异常类栈解旋异常接口声明异常变量的生命周期异常的多态c++的标准异常库编写自己的异常类总结异常 在c语言中,对错误的处理总是两种方法: 1,使用整型的...
    99+
    2022-11-13
  • 一篇文章带你了解mybatis的动态SQL
    目录1、动态SQL:if 语句3、动态SQL:if+set 语句4、动态SQL:choose(when,otherwise) 语句5、动态SQL:trim 语句6、动态SQL: SQ...
    99+
    2022-11-13
  • 一篇文章带你了解JavaScript的解构赋值
    目录1. 什么是解构赋值 ?2. 数组的解构赋值2.1) 数组解构赋值的默认值2.2) 数组解构赋值的应用类数组中的应用交换变量的值3. 对象的解构赋值...
    99+
    2022-11-13
  • 一篇文章带你了解JavaSE的数据类型
    目录前言Java类型汇总整型变量-int\长整型变量-long\短整形变量-short浮点型变量-double\float字符类型变量-char字节类型变-byte布尔类型变量-bo...
    99+
    2022-11-12
  • 一篇文章带你了解Java方法的使用
    目录方法的基本用法 方法定义基本语法格式:为什么方法一般用public static修饰?代码示例:注意事项: 方法调用的调试过程IDEA 的调试过程: ...
    99+
    2022-11-12
  • 一篇文章带你了解JavaScript的包装类型
    目录1、简介2、String1、创建语法2、常用方法3、更多方法3、Number1、语法2、属性3、常用方法4、Boolean总结1、简介 【解释】: 在 JavaScri...
    99+
    2022-11-13
  • 一篇文章带你了解Python中的装饰器
    目录前言Python 中的装饰器是什么语法糖使用 Python 装饰器修改函数行为使用 Python 装饰器对函数进行计时使用 Python 装饰器将有用信息记录到终端Web app...
    99+
    2022-11-13
  • 一篇文章带你了解常用的Maven命令
    目录1、创建 Maven 工程2、Maven 的常用命令①、compile:将Java 源程序编译成 class 字节码文件。②、test:测试,并生成测试报告③、mvn clean...
    99+
    2022-11-13
  • 一篇文章带你了解Maven的生命周期
    目录1、什么是 生命周期?2、Clean Lifecycle:在进行真正的构建之前进行一些清理工作3、Default Lifecycle:构建的核心部分,编译、测试、打包、安装、部署...
    99+
    2022-11-13
  • 一篇文章带你了解spring事务失效的多种场景
    目录前言一 事务不生效1.访问权限问题2. 方法用final修饰3.方法内部调用4.未被spring管理5.多线程调用6.表不支持事务7.未开启事务二 事务不回滚1.错误的传播特性2...
    99+
    2022-11-12
  • 一篇文章带你理解Java Spring三级缓存和循环依赖
    目录一、什么是循环依赖?什么是三级缓存二、三级缓存如何解决循环依赖?三、使用二级缓存能不能解决循环依赖?总结一、什么是循环依赖?什么是三级缓存 【什么是循环依赖】什么是循环依赖很好理...
    99+
    2022-11-12
  • 一篇文章带你了解Java SpringBoot四大核心组件
    目录一、Spring Boot Starter1.1 Starter的应用示例二、Spring Boot Autoconfigure2.1 autoconfigure 简介 三、Sp...
    99+
    2022-11-12
  • 一篇文章带你了解Vue组件的创建和使用
    目录一、什么是组件?二、创建全局组件方式一1、Vue.extend2、Vue.component方式二直接使用Vue.component方式三三、 创建局部组件四、组件中的data ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作