2021-03-05

2021-05-03 太累了。 一、今日目标达成 1、今天开了一天车,回来了。 二、今日流水账 1、早上9点出发,晚上6点到达上海。 2、吃完饭去保利收拾干净,为入驻做好准备。 三、明日计划完成 1、去试驾; 2、保利整理。 四、感悟 太累了,不说了。 ... 阅读详情

javascript中的事件循环(Event Loop)

 

什么是事件循环(Event Loop)?


首先我们要知道javascript是单线程运行的,遇到大的外部文件时,会阻塞下面程序的运行,造成用户体验不好,为了解决这一问题,则用到了计算机系统的一种运行机制,即事件循环(Event Loop)。

同步任务和异步任务。


在javascript中,所有的任务都能分为同步任务和异步任务。

  • 同步任务:立即执行的任务,直接进入主线程执行。
  • 异步任务:异步执行的任务,比如ajax请求,setTimeout定时函数等。

异步任务有分为宏观任务和微观任务

  • 宏观任务常见的为:setTimeout、setInterval
  • 微观任务常见的有:promise.then()、MutaionObserver、process.nextTick(Node.js)

在一个事件循环中,异步事件返回的结果会被放到一个任务队列中,根据这个异步事件的类型会被对应的宏任务队列或者微任务队列。当执行栈为空的时候,主线程会查看微任务队列是否有事件存在,如果不存在,则去宏任务队列中的事件并把对应的回调加入到当前的执行栈。如果存在一次执行队列事件对应的回调,直到微任务队列为空,然后执行宏任务队列中的时间,把对应的回调加入执行栈。如此反复执行则为事件循环。

接下来我们来看个例子:

console.log('1');

setTimeout(() => {		
    console.log('2');
},0);

let p = new Promise((resolve, reject) => {
	console.log('3');
	resolve();
});

p.then(() => {
	console.log('4');
})

console.log('5');



//1 3 5 4 2

我们来分析一下上面代码的执行:

1.首先打印 1

2.执行到settimeout时,此为宏任务,放入宏任务队列。

3.执行promis打印3,resolve()为微任务,放入微任务队列

4.最后打印5,到此为止这条宏任务执行完毕,接着看看是否有微任务,则promis中有一个微任务及p.then()打印4,微任务队列执行完毕。

5.查看是否有宏任务,即setTimeout,执行打印2,则结果为“1 3 5 4 2”

async await


async为异步的意思,await为等待,及await下面的代码要等待await执行完毕在执行。

async function fun() {
	console.log('1');
	await fun1();
	console.log('2'); //阻塞
}

function fun1() {
	console.log('3');
}

fun()
console.log('4');


//1 3 4 2

上面的例子中,await会阻塞下面的代码(即加入微任务队列),先执行async外面的同步代码,执行完后在回到async函数中,在执行阻塞代码,其结果为1 3 4 2。

 

通过对上面的了解,我们大致的了解了事件循环的执行顺序,下面我们来看一个综合的例子

async function async1() {
    console.log('async1 start')
    await async2()
    console.log('async1 end')
}

async function async2() {
    console.log('async2')
}

console.log('script start')

setTimeout(function () {
    console.log('settimeout')
})

async1()

new Promise(function (resolve) {
    console.log('promise1')
    resolve()
}).then(function () {
    console.log('promise2')
})

console.log('script end')

 

分析执行过程

1.执行上面的代码首先执行console.log('script start'),打印‘script start’。

2.接着执行settimeout,其为宏任务,放入宏任务队列。

3.执行async1(),首先打印‘async1 start’,接着执行await async2(),则打印‘ async2 ’,阻塞下面的代码,放入微任务队列,跳出async1()函数,接着执行。

4.执行new Promise,打印‘promise1’,then为微任务,放进微任务队列。

5.最后执行console.log('script end');打印‘script start’。此时的同步任务执行完,接着执行微任务,及async,打印‘async1 end’

6.接着继续执行微任务,即promise.then,打印‘promise2’。

7.上一个宏任务执行完,开始下一个宏任务,即settimeout,打印‘settimeout’

上面例子的打印结果为:script start、async1 start、async2、promise1、script end、async1 end、promise2、settimeout。

 

事件循环图

参考:https://mp.weixin.qq.com/s/9iN7XR1PwXfua8SrabOi5w

【PLIO学习总结】laserMapping中的时间戳与状态更新逻辑 本文仅用于个人学习总结记录。如有错误,请批评指正。 阅读详情

相关推荐

VisionPro实战:5个工业视觉检测案例详解(附代码片段)

本文详细解析了VisionPro在工业视觉检测中的5个实战案例,包括PCB焊点质量检测、汽车齿轮尺寸测量、药品包装缺陷检测等。通过硬件配置方案和软件算法流程的详细介绍,帮助工程师快速掌握VisionPro的应用技巧,提升工业自动化检测效率。

weixin_29284657的博客 518

2021-05-03

cdwtsh1的博客 61

基于Zynq的便携式γ能谱仪设计与实现

数字多道分析器(DMCA)是核辐射能谱测量的核心设备,其本质是将探测器输出的模拟脉冲按幅度数字化分道,构建能量-计数分布曲线,从而支撑放射性核素识别与定量分析。其技术原理依赖高速采样、数字滤波成形、基线恢复与峰值提取等关键信号处理环节,具备高分辨率、优线性度与强抗干扰能力。在环境监测、核安全巡检与野外地质勘探等场景中,对低功耗、小型化、实时性提出严苛要求。本方案采用Xilinx Zynq-7020异构SoC架构,融合FPGA实时数字信号处理与ARM嵌入式控制,实现软硬协同优化,兼顾算法精度与工程落地性,为国

weixin_33173126的博客 190

python3面试题:输入一个时间段,a=202103,b=202105,输出列表[“2021-03“,“2021-04“,“2021-05“]

面试题 输入一个时间段,a=202103,b=202105, 输出列表:[“2021-03”,“2021-04”,“2021-05”] 实现代码 # 输入一个时间段,a=202103,b=202105, # 输出列表["2021-03","2021-04","2021-05"] # 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/yoyoketang/ def out(a=202103, b=202105): a1 = str(a)

qq_27371025的博客 277

Raid5损坏两块盘

  以下为浪潮Inspur NF5460M4型号服务器故障处理过程: 设备raid5组损坏两块硬,并raid组处理离线状态,情况如图:     由于硬盘数据比较重要,面对此情况不要慌我们尽量做到安全保守的保证数据尽可能完整,以下为处理方法,(遇raid5两块盘出现问题处理方法)   以下截图均为遇相同问题的解决图案,并非现场截图。 Ctrl+H 进WebBios界面,发现两...

chen_lipeng的博客 2万+

Qt Design Studio 入门指南:从零开始打造炫酷UI(详细+实用+轻松上手)

本文是Qt Design Studio的详细入门指南,旨在帮助UI设计新手从零开始轻松打造炫酷界面。文章系统介绍了软件的核心概念、安装步骤、主界面解析,并通过创建一个完整的登录界面实例,手把手教学如何拖拽组件、设置属性、添加交互状态与动画。同时,分享了创建自定义组件、管理资源以及提升效率的实用技巧与常见问题解决方案,让读者能够快速上手并应用于实际项目开发。

devops8pract的博客 588

【每日英语】2021-03-05

1.The general gave the order to advance. 将军下了前进的命令。 2.The device is fixed to a post. 这个装置被固定在柱子上。 3.It was middle-class votes they were pitching for. 他们争取的是中产阶级的选票。 4.His informants were middle-class professional women. 他的告密者是中产阶级专家妇女。 5.Politics is still

厚积而薄发 582

汇川PLC用户程序结构详解:如何像搭积木一样配置多任务?附EtherCAT最佳实践

本文深入解析汇川PLC用户程序结构,阐述如何像搭积木一样,通过POU、FB、FC等模块化组件高效配置多任务。文章重点结合EtherCAT通讯场景,分享了任务周期、优先级设置的最佳实践与关键避坑指南,帮助工程师构建稳定、高效的运动控制系统。

weixin_29184075的博客 540

python3面试题:输入一个时间段,a=202103,b=202105,输出列表["2021-03","2021-04","2021-05"]...

面试题 输入一个时间段,a=202103,b=202105, 输出列表:["2021-03","2021-04","2021-05"] 实现代码 # 输入一个时间段,a=202103,b=202105, # 输出列表["2021-03","2021-04","2021-05"] # 作者-上海悠悠 QQ交流群:717225969 # blog地址 https://www.cnblogs.com/...

qq_27371025的博客 55

一套适合 ABAP 初级和中级开发人员,从入门到提高的 ABAP 学习教程

曾几何时,ABAP 就是 SAP 的代名词。ABAP 这门编程语言造就了 SAP 名噪一时的 R/3 产品,同时也是如今 SAP 旗舰级产品,SAP S/4HANA 底层的实现语言。 ABAP 不仅代表着 SAP 这家公司在企业级管理软件市场辉煌的过去,ABAP 自身也在不断地进化着。SAP 不仅在本地部署(On-Premise)领域继续保持着自己绝对的统治地位,而且在云应用领域(Software-as-a-Service, 简称 SaaS), 也推出了自己的解决方案,比如 SAP S/4HANA Clo

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5919

Transformer模型在时间序列预测中的应用:价格和产量预测

Transformer模型由Attention is All You Need论文提出,并在机器翻译任务上取得了巨大成功。其主要特点是使用自注意力机制代替传统的递归或卷积操作进行序列建模。Transformer模型由编码器和解码器组成,其中编码器用于学习输入序列的表示,解码器用于生成目标序列。在时间序列预测中,我们只需要使用Transformer的编码器部分。编码器将历史数据作为输入,学习一个表示,然后使用该表示来预测未来的数值。

HnrzLinux的博客 736
上一篇: 2020-08-06
下一篇: 记企业微信调用wx.getContent判断进入H5页面的入口环境
learning_ever
博客等级 码龄10年 40粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值