首页 > 其他分享 >js事件循环

js事件循环

时间:2023-03-31 17:45:54浏览次数:28  
标签:console 函数 Script js 任务 循环 事件 回调 log

常见的宏任务有 :script、setTimout、setInterva
常见的微任务有 :process.nextTick(node 独有)、Promise.then()、Object.observ

JS 引擎是单线程的,直白来说就是一个时间点下 JS 引擎只能去做一件事情,JS 做的任务分为同步和异步两种,所谓 “异步”,简单说就是一个任务不是连续完成的,先执行第一段,等做好了准备,再回过头执行第二段,第二段也被叫做回调;同步则是连贯完成的。
事件循环由宏任务和在执行宏任务期间产生的所有微任务组成。完成当下的宏任务后,会立刻执行所有在此期间入队的微任务。

运行机制

在事件循环中,每进行一次循环操作称为 tick,每一次 tick 的任务处理模型是比较复杂的,但关键步骤如下:
执行一个宏任务(栈中没有就从事件队列中获取)
执行过程中如果遇到微任务,就将它添加到微任务的任务队列中
宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行)
当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染
渲染完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取)
demo

Promise.resolve().then(()=>{
  console.log('第一个回调函数:微任务1')
  setTimeout(()=>{
    console.log('第三个回调函数:宏任务2')
  },0)
})
setTimeout(()=>{
  console.log('第二个回调函数:宏任务1')
  Promise.resolve().then(()=>{
    console.log('第四个回调函数:微任务2')
  })
},0)
// 第一个回调函数:微任务1
// 第二个回调函数:宏任务1
// 第四个回调函数:微任务2
// 第三个回调函数:宏任务2


console.log('Script开始')
setTimeout(() => {
  console.log('第一个回调函数,宏任务1')
  Promise.resolve().then(function() {
    console.log('第四个回调函数,微任务2')
  })
}, 0)
setTimeout(() => {
  console.log('第二个回调函数,宏任务2')
  Promise.resolve().then(function() {
    console.log('第五个回调函数,微任务3')
  })
}, 0)
Promise.resolve().then(function() {
  console.log('第三个回调函数,微任务1')
})
console.log('Script结束')
node端:
Script开始
Script结束
第三个回调函数,微任务1
第一个回调函数,宏任务1
第二个回调函数,宏任务2
第四个回调函数,微任务2
第五个回调函数,微任务3

浏览器
Script开始
Script结束
第三个回调函数,微任务1
第一个回调函数,宏任务1
第四个回调函数,微任务2
第二个回调函数,宏任务2
第五个回调函数,微任务3

作者:王步宇

标签:console,函数,Script,js,任务,循环,事件,回调,log
From: https://www.cnblogs.com/DTCLOUD/p/17277003.html

相关文章

  • pdf和ppt页数和xlsxStyle jszip3.0兼容
      asynccountPptxSlides(file){   constzip=newJSZip()   constzipFile=awaitzip.loadAsync(file)   constpresentationEntry=Object.values(zipFile.files).find(file=>file.name==='ppt/presentation.xml')   if(!present......
  • NestJs 提供者
    文档:https://docs.nestjs.cn/9/providersProviders是Nest的一个基本概念。许多基本的Nest类可能被视为provider-service,repository,factory,helper等等。他们都可以通过constructor注入依赖关系。这意味着对象可以彼此创建各种关系,并且“连接”对象实例的功能......
  • 字符串和json对象之间的转换关系——一定不要再导错包
    添加依赖<!--fastjson依赖--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.33</version></dependency>  一定不要导错包  字符串转换为json对象importcom.ali......
  • 解决videojs 在Chrome浏览器下报:A network error caused the media download to fail
    记录一下videoJS在Chrome浏览器下有时候出现播放一半或者回退的一个恶心bug,错误提示如下:Anetworkerrorcausedthemediadownloadtofailpart-way.经过一下午的折腾查找,终于在GitHub上看到他们官方的一个解决方案,这个方案目前没有更新在官方文档最新版本中,只是随便提了一下......
  • 前端React框架和jsx语法的编码规范
    基本规则(BasicRules)每个文件只包含一个React组件然而,在一个文件里包含多个没有state或纯组件是允许的。eslint:react/no-multi-comp.经常用JSX语法。不要用React.createElement,除非你从一个非JSX文件中初始化app。ClassvsReact.createClassvsstateless......
  • Fiddler抓包修改拦截的JSON文件
    第一步,打开断电,拦截包  第二步,打开要拦截的网址。然后我们就可以获取这个  右下角就是抓到的返回值,直接修改后,点击运行到完成,放行即可。......
  • nestJs 控制器
    参考:https://docs.nestjs.cn/9/controllers控制器负责处理传入的请求和向客户端返回响应。控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作。为了创建一个基本的控制器,我们使用类和装饰器。......
  • three.js 使用 getWorldPosition 获取世界坐标
    记录一下项目中的需求,组合后旋转,解组后需要模型位置为旋转后位置disCombinationModel(ModelArry,type){//判断是否有选中if(ModelArry.length===1){constob=ModelArry[0]//判断是否是组合if(ob.typeName==='combination'){......
  • js 实现 类继承 通过super 给父级传参的效果
    通过es5实现类继承通过super给父级传参的效果先看看原型继承functiones5parent(name,age){this.name=name;this.age=age;}es5parent.prototype.say=function(){console.log(this.name,this.age,this.sex);}functiones5chil......
  • 全网最详细中英文ChatGPT-GPT-4示例文档-智能编写Python注释文档字符串从0到1快速入门
    目录Introduce简介setting设置Prompt提示Sampleresponse回复样本APIrequest接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例其它资料下载ChatGPT是目前最先进的AI聊天机器人,它能够理解图片和文字,生成流畅和有趣的回答。如果你想跟上AI时代的潮流......