我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Promis比setTimeout()更快的原因是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Promis比setTimeout()更快的原因是什么

本篇内容介绍了“Promis比setTimeout()更快的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

实验

先做一个实验:来看看立即解决的 Promis 和立即超时( 0 毫秒的超时)哪个执行的更快?

Promise.resolve(1).then(function resolve() {   console.log('Resolved!'); });  setTimeout(function timeout() {   console.log('Timed out!'); }, 0);  // logs 'Resolved!' // logs 'Timed out!'

Promise.resolve(1) 是一个静态函数,可返回立即解决的 promise。setTimeout(callback, 0) 执行延迟为 0  毫秒的回调。

Promis比setTimeout()更快的原因是什么

打开执行并检查控制台。您会看到日志先打印了 'Resolved!' ,然后打印了 'Timeout  completed!'。立即解决的承诺比立即超时处理得更快。

是因为 Promise.resolve(true).then(...) 在 setTimeout(..., 0) 之前被调用了,所以 promise  的处理过程会更快吗?

那我们就修改一下实验条件,先调用 setTimeout(...,0):

setTimeout(function timeout() {   console.log('Timed out!'); }, 0);  Promise.resolve(1).then(function resolve() {   console.log('Resolved!'); });  // logs 'Resolved!' // logs 'Timed out!'

执行并查看控制台,结果是一样的!

尽管 setTimeout(..., 0) 在 Promise.resolve(true).then(...) 之前被调用了,但是 'Resolved!'  仍然在 'Timed out!' 之前被输出。

实验表明,立即解决的 promise 在立即超时之前已得到处理。所以。。。这是为什么?

事件循环

与异步 JavaScript 有关的问题可以通过探索事件循环解答答。先回顾一下异步 JavaScript 的工作原理。

Promis比setTimeout()更快的原因是什么

空的事件循环

调用栈(call stack) 是 LIFO(后进先出)的结构,用于存储在代码执行期间创建的执行上下文。简而言之,调用栈执行用来函数。

Web API 是异步操作(fetch 请求、promises、计时器),回调等待这里的工作完成。

**任务队列(task queue)**是一个 FIFO(先进先出)的结构,其中包含准备好执行的异步操作的回调。例如,超时的 setTimeout()  的回调(准备执行)进入任务队列中。

工作队列(job queue) 是一个 FIFO(先进先出)的结构,其中包含准备执行的 promise 的回调。例如,已解决的 resolve  或拒绝回调进入工作队列中。

最后,事件循环(event loop)  会一直监视调用栈是否为空。如果调用栈为空,则事件循环会查找工作队列或任务队列,并使准备好执行的回调出队到调用栈中。

工作队列与任务队列

下面从事件循环的角度来看一下前面的实验。我会逐步分析代码的执行情况。

(1) 调用堆栈执行 setTimeout(..., 0) 并“安排”一个计时器。timeout() 回调存储在 Web API 中:

setTimeout(function timeout() {  console.log('Timed out!');}, 0); Promise.resolve(1).then(function resolve() {   console.log('Resolved!'); });

Promis比setTimeout()更快的原因是什么

事件循环

(2) 调用栈执行 Promise.resolve(true).then(resolve) 并“安排”一个 promise 解析。resolved() 回调存储在  Web API 中:

setTimeout(function timeout() {   console.log('Timed out!'); }, 0);  Promise.resolve(1).then(function resolve() {  console.log('Resolved!');});

Promis比setTimeout()更快的原因是什么

事件循环

(3) promise 立即解决,计时器立即超时。这时计时器回调 timeout() 被“排队”到任务队列,promise 回调 resolve()  被“排队”到工作队列:

Promis比setTimeout()更快的原因是什么

事件循环

(4) 这里是最有意思部分:事件循环优先级使工作排在任务之上。事件循环使 promise 回调 resolve()  从工作队列中出队,并将其放入调用栈中,然后调用栈执行 promise 回调 resolve():

setTimeout(function timeout() {   console.log('Timed out!'); }, 0);  Promise.resolve(1).then(function resolve() {   console.log('Resolved!');});

'Resolved!' 被输出到控制台。

Promis比setTimeout()更快的原因是什么

Event Loop

(5) 最后,事件循环把计时器回调 timeout() 从任务队列中移出到调用栈中。然后调用栈执行计时器回调timeout():

setTimeout(function timeout() {   console.log('Timed out!');}, 0);  Promise.resolve(1).then(function resolve() {   console.log('Resolved!'); });

'Timed out!' 已输出到控制台。

Promis比setTimeout()更快的原因是什么

Event Loop

此时调用栈为空。脚本执行已完成。

“Promis比setTimeout()更快的原因是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Promis比setTimeout()更快的原因是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

有些时候Python中乘法比位运算更快的原因是什么

这篇文章主要介绍“有些时候Python中乘法比位运算更快的原因是什么”,在日常操作中,相信很多人在有些时候Python中乘法比位运算更快的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有些时候Pyt
2023-06-16

MongoDB比Mysql快的原理是什么

这篇文章主要讲解了“MongoDB比Mysql快的原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MongoDB比Mysql快的原理是什么”吧!数据存储方式不同MysqlMySQL是
2023-03-09

mysql索引快的原因是什么

本篇内容主要讲解“mysql索引快的原因是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql索引快的原因是什么”吧!索引就是通过事先排好序,从而在查找时可
2023-04-14

linux比windows安全的原因是什么

这篇文章主要介绍“linux比windows安全的原因是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“linux比windows安全的原因是什么”文章能帮助大家解决问题。六大原因:1、Win自动
2023-06-30

win10老是更新的原因是什么

这篇文章主要介绍了win10老是更新的原因是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win10老是更新的原因是什么文章都会有所收获,下面我们一起来看看吧。win10为什么老是更新win10总是更新是因
2023-07-01

手机耗电快是什么原因

手机耗电快是因为应用程序的使用、屏幕亮度、网络连接、手机老化和充电习惯造成的。详情介绍:1、应用程序的使用,许多应用程序在后台运行时会消耗大量的电量;2、屏幕亮度,长时间使用手机屏幕也会导致电池的快速耗电;3、网络连接,在信号较弱的地方,手
2023-08-18

Go数组比切片好的原因是什么

这篇文章主要讲解了“Go数组比切片好的原因是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go数组比切片好的原因是什么”吧!前段时间有播放一条快讯,就是 Go1.17 会正式支持切片(S
2023-06-15

vue中v-for比v-if高的原因是什么

本篇内容介绍了“vue中v-for比v-if高的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!继续从编译出发以下面的例子出发分析:
2023-07-05

windows驱动更新失败的原因是什么

本文小编为大家详细介绍“windows驱动更新失败的原因是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“windows驱动更新失败的原因是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。驱动更新失败的原因
2023-06-30

XP系统无法更新的原因是什么

本篇内容介绍了“XP系统无法更新的原因是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!曾经听到有人推荐让WindowsXP快10倍的软件
2023-06-14

Python动态编译器中PyPy比C在操作中更容易的原因是什么

今天就跟大家聊聊有关Python动态编译器中PyPy比C在操作中更容易的原因是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Python 语言的动态编译器有很多种,在实际相关应用
2023-06-17

电脑屏幕比例突然变大的原因是什么

电脑屏幕比例突然变大的原因可能有以下几种:1. 分辨率设置改变:在某些情况下,可能会更改电脑的分辨率设置,导致屏幕比例变大。例如,更改分辨率为较高的设置可能会使屏幕比例变大。2. 显示器驱动问题:如果显示器驱动程序发生故障或更新时出现问题,
2023-09-07

香港服务器访问速度快的原因是什么

香港服务器访问速度快的原因可能有以下几点:1.地理位置优势:香港地处亚洲中心,毗邻中国大陆和东南亚等发达地区,便于连接全球各地的网络,使得数据传输速度更快。2.网络基础设施完善:香港拥有高度发达的网络基础设施,包括大量高速网络节点和光纤
香港服务器访问速度快的原因是什么
2024-04-12

runtime error的原因是什么

这篇文章主要介绍“runtime error的原因是什么”,在日常操作中,相信很多人在runtime error的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”runtime error的原因是什么
2023-06-20

win11卡的原因是什么

这篇文章主要介绍“win11卡的原因是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win11卡的原因是什么”文章能帮助大家解决问题。一、安装适配1、如果系统刚刚装好,可能需要一段时间适应配置。
2023-07-02

ecshop慢的原因是什么

ecshop慢的原因:1、服务器配置不当,ecshop的速度和性能受到服务器配置的影响;2、数据库优化不足,数据库是ECShop的核心组件,存储和处理所有商品信息、订单数据等;3、图片和静态资源过多或过大,如果网页中包含大量图片或其他静态资
2023-07-13

编程热搜

目录