位置: IT常识 - 正文

EventLoop(event loop exception null)

编辑:rootadmin
🍀EventLoop JS是单线程的,也就是,同一时间只能做一件事情。所以一旦遇到大量任务或者耗时的任务时,比如加载高清图片,网页就会“假死”,无法响应用户的行为。为了防止这种阻塞,才有了同步和异步的概念。而EventLoop,即事件循环机制,就是我们经常使用异步的原理。 同步任务 非耗时的任务, ... ?EventLoop

推荐整理分享EventLoop(event loop exception null),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:event loop exception,event loop 详解,event loop原理简述,并通过伪代码举例,event loop shut down,event loop shut down,event loop 详解,浏览器eventloop,event loop原理简述,并通过伪代码举例,内容如对您有帮助,希望把文章链接给更多的朋友!

JS是单线程的,也就是,同一时间只能做一件事情。所以一旦遇到大量任务或者耗时的任务时,比如加载高清图片,网页就会“假死”,无法响应用户的行为。为了防止这种阻塞,才有了同步和异步的概念。而EventLoop,即事件循环机制,就是我们经常使用异步的原理。

同步任务非耗时的任务,指的是在主线程上排队执行的那些任务只有前一个任务执行完毕,才能执行后一个任务console.log('111')console.log('222')console.log('333')

上述就是简单的同步任务,会按照顺序输出111,222,333

异步任务耗时任务,异步任务由JS委托给宿主环境进行执行当异步任务执行完之后,会通知JS主线程执行异步任务的回调函数

比如说发一个网络请求,主程序需要等到接收到数据后再去做其他的事情。当异步完成后,可能程序正在做其他的事情,所以即使异步完成了也需要在一旁等待,等到程序空闲下来才有时间继续执行。

异步任务分为宏任务和微任务。

为了防止一个函数执行时间过长阻塞后面的代码:

会先将同步代码压入执行栈中,在主线程上依次执行;将异步代码推入任务队列,任务队列又分为宏任务队列和微任务队列;因为宏任务队列的执行时间较长,所以微任务队列要优先于宏任务队列。如果执行栈中的所有同步任务执行完毕,就会读取任务队列,将可运行的异步任务添加到执行栈中,开始执行。宏任务

每次执行栈执行的代码就是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行)

浏览器为了能够使得JS内部宏任务与DOM任务能够有序的执行,会在一个宏任务执行结束后,在下一个宏任务执行开始前,对页面进行重新渲染。所以宏任务执行是在DOM渲染之后。

宏任务包括:

异步Ajax请求setTimeout、setIntervalpostMessage文件操作微任务EventLoop(event loop exception null)

微任务就是在当前任务结束之后立即执行的任务。微任务在渲染之前执行,所以它的响应速度相比宏任务会更快,因为无需等渲染。

微任务包括:

Promise.then、.catch、.finallyprocess.nextTick

运行机制先执行主线程中的同步任务遇到异步宏任务,就将其放入宏任务队列中遇到异步微任务,就将其放入微任务队列中主线程任务执行完后,从微任务队列中取出任务到主线程中,直到微任务队列为空。在这个过程中,如果遇到微任务中又有微任务,会将其依次放入微任务队列中微任务执行完毕后,从宏任务队列中取出任务到主线程中。在一个宏任务的执行过程中,如果遇到微任务,就会将其放入到微任务队列中。每一个宏任务执行完之后,都会检查是否存在正在等待执行的微任务,如果有就会先将所有微任务执行完,再执行下一个宏任务。

根据上述的解释,先来判断一下这段代码的输出结果

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

正确的输出结果是:2431

执行的过程:

①先执行所有的同步任务(第5行、第10行)

②再执行微任务(第8行,promise.then是微任务)

③在执行下一个宏任务(第2行,setTimeout是宏任务)

再看一个复杂的例子

console.log('1');setTimeout(() => {console.log('2');new Promise(function(resolve) {console.log('3')resolve()}).then(function() {console.log('4')})})new Promise(function(resolve) {console.log('5')resolve()}).then(function() {console.log('6')})setTimeout(() => {console.log('7')new Promise(function(resolve) {console.log('8')resolve()}).then(function() {console.log('9')})})

输出的结果为:156234789

需要注意的点就是执行完每个宏任务,都会把微任务队列中的执行完,才能再执行下一个宏任务

本文链接地址:https://www.jiuchutong.com/zhishi/313371.html 转载请保留说明!

上一篇:免费下载海洋CMS高防7kb影视网站模板-OK源码(海洋cms有安卓版下载)

下一篇:discuz设置问题:如何设置附件售价的最高值?(discuz设置门户)

  • 印花税的征税范围具体有哪些
  • 第三方代付款的账务处理
  • 税收指的是什么
  • 计提环境保护税怎么做分录
  • 个税申报与社保申报一定是一致的么
  • 银行现金增加会计分录
  • 一般纳税人转成小规模的条件
  • 银行承兑汇票背书可以拆分
  • 某公司是一家刚成立的大型化妆品生产企业
  • 机动车发票申请流程
  • 增值税汇总纳税政策文件
  • 公司按最低标准缴纳社保
  • 支付税收罚款怎么算企业所得税
  • 企业收回报废产品合法吗
  • 价内税和价外税名词解释
  • 个人投资理财需要注意什么
  • 没有汇算清缴可以弥补以前年度亏损吗
  • 物业管理行业税点
  • 账面价值大于计税基础产生什么差异
  • 交易性金融资产和长期股权投资的区别
  • 公益性生物资产有哪些
  • 增值税进项余额月末转吗
  • 生产企业出口退税全部流程
  • 运费收入会计处理
  • 或有负债披露原则
  • 什么是额定功率和峰值功率
  • 主营业务成本算损益类科目吗
  • 长期贷款利息怎样计算
  • 端游上古世纪
  • PHP中使用全局变量来接受表单中提交的数据
  • memcache php
  • 评估价值时点依据什么
  • 经营性租赁与融资性租赁
  • 结转存货的成本叫什么
  • 开机要按f1才能启动
  • kaggle官网注册
  • pnp.npn
  • 应付股利的会计分录T
  • 存货的期末计价方法是遵循哪个信息质量原则
  • thinkphp批量修改
  • 劳务派遣如何做绩效考核
  • js设置input值
  • 萤火虫发光器的用途
  • ai绘图素材
  • 记录一次排查PHP脚本执行卡住的问题
  • php imagefill
  • vue组件通信方法
  • zip 压缩命令
  • 怎么用php写一个简单框架
  • 银行回单打回来会计要做什么
  • 工会经费残保金怎么申报
  • 转账收手续费不
  • python @time
  • python文件可分为哪几类
  • 上月结余金额是什么的
  • 长期股权投资成本法转权益法的处理
  • 差额征税小规模纳税人免税销售额栏次
  • 短期借款的核算会计分录
  • 企业所得税弥补亏损怎么弥补
  • 营业成本怎么理解
  • 折价购买股权账务处理
  • 出口报关金额怎么算
  • 一般纳税人企业所得税税率
  • 为员工买的商业保险怎么做账
  • win10系统小娜不见了
  • xp系统如何获取ip地址
  • linux那些事儿
  • soffice.exe - soffice进程是什么意思 有什么用
  • win10语音识别怎么打开
  • linux shell脚本命令
  • 一个简单的灵魂福楼拜
  • html5的全局属性
  • nodejs查找文件
  • node 加密解密
  • python生成pyc
  • js获取文本框的值进行计算
  • js中如何弹出提示框
  • 台资企业有什么
  • 深圳国税咨询电话是多少
  • 为什么每年都要交车船税是什么意思
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设