JS 堆栈事件调用(同步调用、异步调用);消息队列和作业队列
同步调用
const bar = () => console.log('bar')
const baz = () => console.log('baz')
const foo = () => {console.log('foo')bar()baz()
}
foo()
代码会打印出
- foo
- bar
- baz
调用堆栈:
异步调用
const bar = () => console.log('bar')
const baz = () => console.log('baz')
const foo = () => {console.log('foo')setTimeout(bar, 0)baz()
}foo()
在运行此代码时,会首先调用foo(),在foo()内部,按序执行,但是在调用setTimeout时,将参数bar()传入,浏览器或Node.js会启动定时器,定时器到期时,再将回调函数放到消息队列中。所以这里会先执行baz()。
事件循环会赋予调用堆栈优先级,它首先处理在调用堆栈中找到的所有东西,一旦其中没有任何东西,才开始处理消息队列中的东西。
已上述代码为例,会在所有函数执行完后再执行setTimeout内的函数。
也就是说我们不必等待诸如 setTimeout、fetch、或其他的函数来完成它们自身的工作,因为它们是由浏览器提供的,并且位于它们自身的线程中。 例如,如果将setTimeout 的超时设置为 2 秒,但不必等待 2 秒,等待发生在其他地方。
代码会打印出
- foo
- baz
- bar
堆栈调用:
ES6 作业队列
ECMAScript 2015 引入了作业队列的概念,Promise 使用了该队列(也在 ES6/ES2015 中引入)。这种方式会尽快地执行异步函数的结果,而不是放在调用堆栈的末尾。
在当前函数结束之前 resolve 的 Promise 会在当前函数之后被立即执行。
const bar = () => console.log('bar')
const baz = () => console.log('baz')
const foo = () => {console.log('foo')setTimeout(bar, 0)new Promise((resolve, reject) =>resolve('应该在 baz 之后、bar 之前')).then(resolve => console.log(resolve))baz()
}foo()
在运行此代码时,会首先调用foo(),在foo()内部,按序执行,但是在调用setTimeout时,将参数bar()放到消息队列中(也就是在清空堆栈之后立即被执行),接着将Promise 放到作业队列中(即当前函数执行完后被立即执行),然后直接执行baz()。当函数foo()执行完后先执行Promise,当Promise执行完后堆栈清空,即可执行消息队列中的内容,也就是执行bar(),执行完后堆栈清空,调用结束。
打印结果:
- foo
- baz
- 应该在 baz 之后、bar 之前
- bar
本文借鉴于:Node.js事件循环
写的不错,保存:https://blog.csdn.net/qq_41860203/article/details/112735573
JS 堆栈事件调用(同步调用、异步调用);消息队列和作业队列相关推荐
- 浅谈WebService开发二(同步与异步调用)转
上文 <http://www.dotnetgeek.cn/xuexiwebservice1.html>已经跟大家说了,如果创建一个webservice和简单的调用,本文将注重webserv ...
- iOS网络开发中的同步、异步和请求队列
在iOS网络编程中,我们经常会遇到线程的同步和异步问题,同时为了对异步请求更加精准丰富的控制,我们还常常在iOS中使用请求队列,下面就来谈谈iOS开发中同步.异步以及请求队列的使用方法. 1. 同步意 ...
- Dubbo 同步、异步调用的几种方式
我们知道,Dubbo 缺省协议采用单一长连接,底层实现是 Netty 的 NIO 异步通讯机制:基于这种机制,Dubbo 实现了以下几种调用方式: 同步调用 异步调用 参数回调 事件通知 同步调用 同 ...
- C#的同步和异步调用方法
同步和异步大家都明白什么意思,在这里不多介绍了. namespace ConsoleTest {class Program{static void Main(string[] args){Consol ...
- Socket_TCP协议的同步与异步调用
同步: Accept Connect Receive 异步: BeginAccept EndAccept BeginReceive EndReceive TCP是一种面向连接的.可靠的.基 ...
- java http异步调用_HttpClient的异步调用,你造吗?
一.前言 HttpClient提供了两种I/O模型:经典的java阻塞I/O模型和基于Java NIO的异步非阻塞事件驱动I/O模型. Java中的阻塞I/O是一种高效.便捷的I/O模型,非常适合并发 ...
- java 异步调用方法_java异步调用方法有哪些?如何实现异步调用?
你知道java异步调用方法都有哪些吗?下面的文章内容,就对这方面的问题做了一下整理,一起来看看java异步调用的方法吧! 1.利用Spring的异步方法去执行 注:没有返回值 在启动类又或者是配置类加 ...
- JS执行机制、同步和异步、宏观任务和微观任务
1. JS 是单线程 JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事. 这是因为 Javascript 这门脚本语言诞生的使命所致--JavaScript 是为处理页 ...
- FreeRTOS记录(七、FreeRTOS信号量、事件标志组、邮箱和消息队列、任务通知的关系)
我们在前面单独介绍过FreeRTOS的任务通知和消息队列, 但是在FreeRTOS中任务间的通讯还有信号量,邮箱,事件组标志等可以使用 这篇文章就这些成员与消息队列和任务通知的关系进行说明分析 ..增 ...
最新文章
- VS2010与.NET4系列 20.VS2010的JavaScript智能感知增强
- Python的库和资源
- HTML-参考手册: HTML 颜色名
- Spark详解(二):Spark完全分布式环境搭建
- SAP Cloud Connector里的virtual host和internal host有什么区别
- eclipse折叠if语句块_Python学习日志01判断 if 语句
- NYOJ 289 苹果(01背包)
- kpi绩效考核流程图_KPI绩效考核法
- 武汉学java_学习武汉Java开发想要找到工作,需要学到什么程度呢?
- ASA防火墙IPSEC ***配置
- Python和C++交互
- 代理服务器-贪心算法
- 产品部和业务部门是什么关系
- 数组常用操作。以逗号隔开、以逗号+单引号隔开、转List等
- 阿里云服务器安装并配置nginx代理转发请求
- 大数据实验室第一次考核
- 【SAP-CO】CO模块主要子模块相关概念
- 交互设计软件Framer X for mac软件测评
- 重磅推荐,国内国外优秀的素材资源网站
- Android 小知识:startActivity 与 finish 的调用顺序
热门文章
- 软件构件技术期末复习
- 二等水准测量记录数据_二等水准测量记录计算示例.doc
- c语言小白能自学吗,零基础小白学编程,该如何入门?
- 安装Chrome插件-ChroPath
- python概率编程_TensorFlow新功能:TensorFlow Probability概率编程工具箱介绍
- 【前端——Node.js】:身份认证
- 疯狂模渲大师链接永久是最新版|怎么安装客户端并激活素材库联系作者加载自营专属素材扩展包高效使用超一流辅助插件脚本工具的步骤教程?...
- new Date兼容iOS和Android
- 机器人无限火力无限e符文_无限火力快乐玩法:无限击飞机器人
- 计算机服务里wlan功能是什么意思,WLAN是什么意思?WLAN基础知识介绍