重写宏任务与微任务!

2024前端面试(JS专题) 一般比较大一点的公司面试或笔试问题的重点都侧重于js这块,考验你js的功底扎不扎实。所以在准备面试的时候,js一定要复习好,而且要过好几遍,直至熟练回答为止,有的甚至需要手写几遍。毕竟机会都是给有准备的人的。下面给大家整理了一下面试中常问的js问题。大家可以查缺补漏。 阅读详情

事件循环

  • js引擎是单线程的,也就是同一时间只能做同一件事
  • js做的任务分为同步和异步任务,异步的话意思就是一个任务不是连续完成的,而是先执行一段代码,再执行另一段,另一段的代码也称为回调,而同步代码则是一次性完成。
  • 像一些读取文件,网络请求这样的操作,就是一个异步任务,因为中间的操作,需要别的线程或者进程去完成,不需要js引擎,所以这个时候就可以先去完成其他任务,节约时间,等中间操作完成之后,再去执行相应的回调函数就可以了
  • 回调函数分为2种,一种是同步回调,另一种是异步回调,同步回调就是在函数返回前就执行了这个回调函数,异步回调是函数返回之后才执行这个回调函数
  • js异步的实现就是事件队列来完成的

事件循环是由一个队列组成的,异步任务的回调遵循先进先出,在 JS 引擎空闲时会一轮一轮地被取出,所以被叫做循环。

根据队列中任务的不同,分为宏任务和微任务。

js单线程的原因

如果js是多线程的话,对于一个dom元素,如果一个线程删除掉这个元素,另一个线程要修改这个元素,这是就会出现矛盾

js需要异步的原因

js是单线程的,单线程在执行程序时,所走的程序路径按照连续顺序拍下来,前面的处理好才会执行后面的代码,即自上而下执行,若js没有异步的话,当前面的代码执行需要花费很多时间而与后面的代码没有关联,后面的代码就会被堵塞,影响用户体验

宏任务与微任务

  • 主线程在处理任务的时候,很有可能同时添加了新的任务,还有可能通过Io线程进行进程通信ipc添加新任务,所以需要一个消息队列用来存储任务
  • 单线程模式下,有以下要解决的问题
    • 如何处理较高级别的任务,比如一个点击任务,用户点击完需要登台排在这个点击任务之前消息队列里的任务执行完之后再执行,显然很影响体验,为了解决这个问题,引入了微任务。即消息队列中的任务称为宏任务,每个宏任务对应有一个微任务队列,当一个宏任务执行完之后,会先执行这个宏任务的微任务队列,再执行下一个宏任务
    • 如何解决处理单个任务执行时间过长的问题

setTimeout如何实现

  • settimeout这种任务不适合添加在任务队列中,因为并不确定任务队列里的任务还要执行多久,而settimeout的延迟时间是确定的,对此,引入了延迟多列,会将settimeout的回调函数添加进延迟队列中,并记录回调函数被添加的时间和延迟时间
  • 在主线程中每执行完一个宏任务之后,就会根据发起时间和延迟时间计算延迟队列中是否有到期需要执行的任务
  • 定时器还可以取消,给定时器分配一个唯一的Id,但执行到定时器取消的任务时,就从延迟队列中将该任务删除掉
陷阱
  • 执行时间不准确:主进程会将当前任务执行完成之后,再去执行延迟队列的任务,如果当前任务执行的时间超过了定时器设置的延迟时间,就会出现定时器执行的时间不准确

  • 如果定时器存在嵌套调用时,系统会设置最短的调用时间为4ms,在chrome中,如果定时器被嵌套调用超过5次的话,就会认为该函数被阻塞了,如果此时定时器的调用时间间隔少于4ms的时候就会将每次调用的时间设置为4ms。比如下面这段代码,前5次会执行的比较快,因为设置的时间间隔少于4ms,所以后面就会每隔4ms之后再执行函数

    function cb() { setTimeout(cb, 0); }
    setTimeout(cb, 0);
    
  • 延迟执行时间有最大值,浏览器一般以32bit来存储延迟时间的,32bit最多能够存放的数字是2147483647 ms,这就表示如果设置的时间超过这个时间就会溢出,但出现溢出的话,定时器的任务会被立即执行

  • 未激活的页面,setTimeout 执行最小间隔是 1000 毫秒

注意,定时器是一个宏任务,看下下面这段代码

new Promise((resolve) => {
    resolve('OK')
}).then(() => {
    setTimeout(() => {
        console.log('11');
    }, 100)
})

setTimeout(() => {
    console.log(22);
}, 100)

一开始以为会先输出11再是22,因为我想的是当同步代码执行完之后,看到了最下面的定时器是个宏任务所以不去理睬它,先执行then里面的微任务,就把第一个定时器添加到任务队列里,接着再添加第二个定时器。

但这样想是错误的,可能会被之前的延时队列搞混了,正确的应该是当执行完new promise里面的代码之后,看到then里面是微任务,就把它添加到微任务队列中,接着往下执行,就会看到最后一个定时器,就把它加入到宏任务队列中,当执行到下一个宏任务的时候,因为里面有一个需要延迟执行的回调函数,所以会将这个回调函数加入到延迟队列中,接着再以同样操作将第一个定时器的回调函数添加到延迟队列中,所以执行结果是22 11

只有当settimeout这个任务被执行的时候,才会把里面的回调函数添加到执行队列中

浏览器的事件循环

当新打开一个页面的时候,浏览器会为这个页面分配一个渲染进程,渲染进程包括渲染主线程,io线程等,渲染主线程主要是来执行任务的,也可以理解为执行js代码,就包括

  • 渲染dom,如解析dom,计算布局,绘制
  • 用户交互事件,如鼠标点击,页面滚动,放大缩小等
  • js脚本执行事件
  • 网路请求完成,文件读写完成事件

浏览器的事件循环由一个宏任务队列和多个微任务队列组成

  • 首先,先执行一个宏任务,每个宏任务都有自己的微任务队列
  • 当遇到宏任务时,就添加到宏任务队列中,当遇到微任务时,就添加到自己的微任务队列中
  • 同步代码执行完成之后,再执行自己的微任务队列里的任务,这个过程中如果再遇到微任务,还是会添加到自己的微任务队列中

Node的事件循环

node的事件循环跟浏览器的不太一样,他给宏任务和微任务分了等级,也就是如果在一个宏任务队列中出现多个任务时,会按照他们的等级来执行,而不是根据进入队列的时间来执行

  • 宏任务的优先级如下,图是在掘金里面找的:

  • 具体每个任务队列是做什么的,目前还没有深入的了解

  • 在node11之前,会先把一个宏任务队列里的任务全部执行完之后,再去执行微任务队列里的全部任务,但再node11之后,会在一个宏任务执行完之后就去执行微任务队列里的任务

由于对于这一块理解还不是很深刻,日后有机会再来修改!!!

ES6 —— 3、async-await、微任务和宏任务、class、proxy(代理) 重写留言板2: index2.js const obj = { m:new Map(), $:name => document.querySelector(name), bind:function(){ this.$(".submit").onclick = () =>{ let [_name,_message] = [this.$(".name").value,this.$(".message").va... 阅读详情

相关推荐

泛微ecology9写计划任务

最近用建模引擎搭建了个证照,证照都是有有效期的,希望系统每天可以检测证照的有效期,对于已经过期的,把证照状态更新为“已过期”。如果有些已经过期的证照,后面维护人又延长了有效日期,则把证照状态由已过期修改为 “有效”。

redroyal的博客 1344

宏任务微任务

宏任务微任务

lxy123456qqq的博客 338

使用RPA 一键抓取微头条爆款标题,重写,并发布到草稿箱

最后经验分享: 我之前是通过RPA获取到的爆款标题和图片,进行使用爆款标题重写后,上传,但是数据不是很好,之后改成美女图片的封面,之后流量迅速好转,但是注意不要侵权,建议去用大模型生成场景化的性感照片,增加阅读量。9月份泽安一直在社群进行分享,但是分享的都是AI 智能体Coze的相关应用,泽安的定位是RPA+AI智能体方向,同事群里来的小伙伴也是对这两个感兴趣的,就随机在群里展开了一乱调研,咱也不废话了,直接上代码: RPA 代码主流程。所以自己把7月份做微头条的经验今天分享出来!RPA 生成微头条文章。

zzling2024的博客 2578

微任务,宏任务,DOM渲染的执行顺序

event loop过程 同步代码,一行一行放在Call Stack执行 遇到异步先记录下来,等待时机(定时,网络请求) 时机一到立马推入Callback Queue中 如Call Stack为空(同步代码执行完毕),Event Loop开始工作 轮询查找Callback Quque,有则移动到Call Stack中执行 然后继续轮询查找 例1 console.log(100) setTimeout(() => { console.log(200) }, 5000); console.lo

weixin_44138611的博客 5900

避坑指南:泛微ecology9计划任务开发中常见的5个错误及解决方法

本文总结了泛微ecology9计划任务开发中常见的5个错误及解决方法,涵盖BaseCronJob继承、SQL性能优化、部署路径、前端配置和环境依赖等关键环节。重点解析了如何正确重写execute方法、编写高性能SQL、确保类文件正确部署,并提供了详细的异常处理和日志记录方案,帮助开发者提升代码健壮性,避免任务执行失败或数据错误。

weixin_29216049的博客 429

泛微ecology9中基于BaseCronJob实现证照状态自动更新计划任务

本文详细介绍了在泛微ecology9系统中,如何基于BaseCronJob类开发并部署一个自动更新证照状态的后台计划任务。通过继承BaseCronJob并重写execute方法,实现每日自动扫描数据库,根据有效期更新证照状态,从而提升数据准确性与管理效率。文章涵盖了从需求分析、代码编写、部署配置到调试监控的完整实践指南。

weixin_28454475的博客 90

EventLoop循环机制详解(微任务、宏任务与async-await)

https://www.jianshu.com/p/5b4c4756e461 图片引用 首先明晰两个概念: 宏任务和微任务 也称之为 task 和microtask ,微任务要先于宏任务执行 宏任务主要有: script(整体代码)、setTimeout、setInterval、I/O、UI 交互事件、postMessage、MessageChannel、setImmediate(Node.js 环境)。 微任务主要有: Promise.then、 MutationObserver、 proce.

前端啤酒屋 407

javascript教程|微任务(Microtask),rejection,async,await,thenables,error处理,

Promise 处理始终是异步的,因为所有 promise 行为都会通过内部的 “promise jobs” 队列,也被称为“微任务队列”(V8 术语)。因此,.then/catch/finally 处理程序总是在当前代码完成后才会被调用。如果我们需要确保一段代码在 .then/catch/finally 之后被执行,我们可以将它添加到链式调用的 .then 中。

VAN 865

JavaScript事件循环、微任务与MutationObserver全面解析(AI协助重写)

【代码】面试题-模拟微队列。

写点什么好 298

树莓派 SPI操作

扩展板配备一款0.96inch,128864分辨率的oled显示屏,通过SPI控制,先上显示效果图。由于程序过长,在这里我就不把代码全部贴出来了,只是简单讲解一下spi的操作函数。管脚如下如所有,左边方框的管脚分别为MOSI MISO SCLK,左边CE0,CE1为两个片选管脚,分别对应上图中的spidev0.0,spidev0.1两个设备。下载spidev库,复制到树莓派,并行运行如下命令解压安装。spi设备,此处设备为/dev/spi-decv0.0。在/dev路径下面,我们可以发现两个spi设备。

weixin_46529898的博客 914

DRAM内存模拟持久化设备的方法

由于持久化内存介质NVM技术的发展,越来越多的科研工作者投身到NVM相关的研究当中。但由于目前工业界并没有推出广泛使用的NVM介质设备,所以科研工作都需要自己以现有的条件,模拟NVM设备使用场景。一个简单的方法是:通过修改DRAM模拟器,达到模拟NVM的目的(可以参考:DRAMSim2模拟器分析与应用)。更高端的方式是:在真实系统中,将内存划分出一块儿,用来模拟NVM设备(类似于传统的ramdis

酷炫人笨笨熊 1899

alert确认后执行_微任务、宏任务、DOM渲染的执行顺序

event loop(事件循环机制)1. 同步代码,一行一行放在Call Stack执行2. 遇到异步先记录下来,等待时机(定时,网络请求)2. 时机一到立马推入Callback Queue中3. 如Call Stack为空(同步代码执行完毕),Event Loop开始工作4. 轮询查找Callback Quque,有则移动到Call Stack中...

weixin_42364040的博客 1173

搞定ESD(四):ESD干扰耦合路径深入分析(二)

静电放电过程中静电干扰主要通过三种间接耦合方式干扰敏感源,即电场耦合、磁场耦合、地弹。前文已经深入分析了静电放电过程中的电场耦合,今天就谈谈静电放电过程中的磁场耦合,也可以理解环路耦合。熟话说的好〝人往高处走,水往低处流〞,静电电流也会选择阻抗最低的路径返回到源端。静电电流流会源端的路径实际上就构成了电流环路,当敏感信号形成的电流环路与静电电流环路存在共环路时,就会将静电放电干扰耦合到敏感信号环路内,干扰敏感信号。

记得诚 2796

重写Spring的Scheduled来实现定时任务的开关功能

为什么80%的码农都做不了架构师?>>> ...

weixin_34384915的博客 2035

PCIe协议之 Equalization篇 之 谈谈几种模式

对于两端有能力最高支持 32 GT/s 及以上速率的设备,如果把目标速度设置为 8 GT/s 或 16 GT/s 速率,是不建议采用 Bypass-Equalization-to-Highest-Rate 模式的,即便采用了,也不会针对 8 GT/s 或 16 GT/s 的目标速率进行 EQ。对于支持 32 GT/s 及以上速率的设备,其可能根本无需工作在 8 GT/s 或 16 GT/s 速率,这时再针对 8 GT/s 或 16 GT/s 速率进行 EQ,多少有点浪费。

那么菜的博客 567

嵌入式SDIO 总线面试题及参考答案

SDIO 的 4 位总线模式是一种提高数据传输效率的工作模式。在传统的 1 位总线模式下,数据只能通过一根数据线(DAT0)进行传输,这限制了数据传输的带宽和速度。而在 4 位总线模式下,DAT0 - DAT3 这 4 根数据线同时用于数据传输,相当于在同一时间内可以传输 4 倍于 1 位模式的数据量,从而显著提高了数据传输的带宽和速度。要通过 CMD6 命令将 SDIO 总线从当前模式切换到 4 位总线模式,需要遵循以下步骤:第一步,主设备需要确保 SDIO 卡支持 4 位总线模式。

大模型大数据攻城狮的专栏 1719

句子重写任务近年有哪些值得关注的工作?看这一篇就够了!

©作者|叶哲宇单位|携程旅行网-帝国理工学院研究方向|文本生成&机器问答在多轮对话问答,端到端对话聊天机器人等多个场景下,不完整的句子在现有框架下的处理显得尤为棘手。句...

Paper weekly 2366

第0章 《机器人工程师带你入门SLAM》专栏所有文章目录汇总(截止目前115篇文章),方便大家查看阅读

《机器人工程师带你入门SLAM》专栏文章汇总:优快云热销专栏已更新100+篇优质内容,涵盖SLAM技术全栈知识体系。文章分为三大类:1)基础工具与环境配置,包括Ubuntu、Git等必备技能;2)C++编程从入门到进阶,详解变量、类、模板等核心概念;3)SLAM核心库实战,深入解析ROS、Eigen、PCL等关键库的应用。专栏提供从计算机基础到项目实战的系统学习路径,并附代码实例。点击专栏主页可订阅查看全部内容,后续将保持更新。

行知SLAM 1069

AI安全防御:任务重写与执行截断技术解析

在人工智能安全领域,任务重写与执行截断是两种关键的主动防御技术。任务重写通过语义理解将潜在有害操作转换为安全等效操作,保持功能可用性同时消除风险;执行截断则在任务执行过程中实时监控,偏离安全边界时立即中断并恢复安全状态。这些技术解决了传统安全模型难以应对语义隐蔽性、过程分散性和上下文依赖性等新型威胁的挑战。在金融、医疗等行业,它们能自动嵌入合规控制点或防止隐私泄露,实现安全性与业务连续性的平衡。随着AI系统的广泛应用,结合LLM意图解析和多模型协作的主动防御机制,正成为保护关键业务免受高级威胁的重要技术方案

weixin_29323273的博客 257

DeerFlow 系列教程 第四篇 | Sandbox 沙箱与 Sub-agent 子智能体协作详解

DeerFlow 系列教程第四篇介绍了两个关键子系统:Sandbox 沙箱系统和Sub-agent子智能体协作机制。沙箱系统通过虚拟路径映射、权限白名单、命令审计和容器隔离四重机制,为Agent提供安全的代码执行环境,使其能在隔离环境中执行文件操作和脚本运行。系统采用分层架构设计,包含应用层、工具层、审计层等,核心是定义标准交互接口的抽象基类。虚拟路径系统将Agent操作的虚拟路径映射到实际路径,确保安全性。这些功能使DeerFlow从对话助手进化为能处理复杂任务的Super Agent平台。

weixin_43674738的博客 285

使用 MATLAB/Simulink + Simscape Electrical 来构建一个CCHP微电网与新能源协同运行的模型

随着能源需求的增长和对环境保护要求的提高,冷热电联供(Combined Cooling, Heating and Power, CCHP)系统作为一种高效的分布式能源解决方案,越来越受到关注。CCHP系统通过利用一次能源同时产生电力、制冷和供热,实现了能源的梯级利用,提高了能源使用效率。结合太阳能、风能等可再生能源,可以进一步增强系统的灵活性和环保性。本文将详细介绍如何使用来构建一个CCHP微电网与新能源协同运行的模型,并通过仿真分析其性能表现。本文介绍了如何使用构建一个。

xiaoheshang_123的博客 141

【GameMaker】滥用宏:创建语法扩展

本文的目的并不是探讨使用宏作为语法扩展是否实用、有益,甚至是否是一个好主意。相反,本文旨在向那些对此感兴趣的人介绍这些想法。文中概述了创建此类语法扩展的基本方法。注意:尽管宏通常按约定使用风格,但本文中所有类似于关键词的宏定义将使用snake_case。本文假设读者对宏有基本的了解,但对于那些想要快速入门的人来说:宏的作用是将某段代码替换为另一段代码的指令。宏在程序编译后不再存在,因为它们的任务在编译时就已经完成了。更具体地说,宏是一种编译指令或预处理指令,允许开发者将符号分配给(常用的)源代码。

Ceyase的博客 999

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

宏内核与微内核、Linux内核与Unix内核的区别

操作系统内核可能是微内核,也可能是单内核(后者有时称之为宏内核Macrokernel)。按照类似封装的形式,这些术语定义如下: 单内核:也称为宏内核。将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效。微内核:功能被划分成独立的过程,过程间通过IPC进行通信。模块化程度高,一个服务失效不会影响另外一个服务。Li

菜鸟大侠的专栏 4万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

泛微OA发送内部邮件教程【E9版本】

泛微OA发送内部邮件教程1.发布泛微邮件的WebService接口2.使用eclipse根据wsdl生成客户端3.接口重写问题4.使用kettle定时发送内部邮件 1.发布泛微邮件的WebService接口 1.在客户编译环境(一般默认是ecology\classbean)下,找到\META-INF\xfire\services.xml文件, 在文件中的beans标签内部加入配置 <service> <name>EmailService</name>

放学不要跑的博客 6674

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【大前端01-01】函数式编程与JS异步编程、手写Promise

【作业】函数式编程与JS异步编程、手写Promise简答题一、谈谈你是如何理解JS异步编程的,EventLoop、消息队列都是做什么的,什么是宏任务、什么是微任务?如何理解JS异步编程EventLoop是做什么的消息队列是做什么的什么是宏任务什么是微任务代码题一、将下面异步代码使用Promise的方式改进二、基于以下代码完成下面的四个练习练习1:使用函数组合fp.flowRight()重新实现下面这个函数练习2:使用fp.flowRight()\fp.prop()和fp.first()获取第一个car的na

时光海的博客 598

宏内核和微内核介绍

宏内核和微内核的基本概念 宏内核:简单来说,就是把很多东西都集成进内核,例如linux内核,除了最基本的进程、线程管理、内存管理外,文件系统,驱动,网络协议等等都在内核里面。将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效。 优点:效率高 缺点:稳定性差、开发过程中的bug经常会导致整个系统挂掉 ...

鹏鹏的博客 8638
上一篇: 写给小白的手写promise源码
下一篇: html,css,javascript是怎样变成页面的?
Lin__hr
博客等级 码龄6年 5粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值