Promise与setTimeout

回调地狱(callback)和promise以及将setTimeout封装成promise Callback与Promise,将setTimeout封装成Promise 为什么回调地狱(Callback hell)会发生? Promise披着怎样的面纱? 首先Promise的出现,是为了将困在Callback hell中的芸芸众生解救出来,相信回调地狱是JavaScript开发人员最头疼的问题之一吧!尤其在接手前人的代码时,打开看到满满的Callback嵌套,是不是很想递出辞职信;那么Promise是如何解救痛苦中的芸芸众生的呢! 目录 1.回调函数的顺序与回调地狱 2.定时器 3.网络请求 阅读详情

Promise是ES6新提出的概念,可以把它看作是异步操作和回调函数的中转站,或者是保存异步操作结果的容器。通过Promise,可以将异步操作通过同步流程表现出来。具体介绍参考ESMAScript6 入门。

之前在网上看到一道题目:

(function test() {
setTimeout(function() {console.log(4)}, 0);
new Promise(function executor(resolve) {
console.log(1);
for( var i=0 ; i<10000 ; i++ ) {
i == 9999 && resolve();
}
console.log(2);
}).then(function() {
console.log(5);
});
console.log(3);
})()

输出结果为 1 2 3 5 4 

这道题目涉及到JavaScript 的事件循环机制。

JavaScript有一个调用栈。在执行代码时,遇到同步任务就放入调用栈中执行,遇到异步任务,如 Ajax   setTimeout 等,就将其放入浏览器的其他模块中去处理。处理完成后将回调函数放入任务队列中,等待调用栈中的任务执行完成后就开始执行。下面以setTimeout为例。

setTimeout(function(){console.log('123')},1000)

浏览器将其放入调用栈后,检测到是异步任务,将其放入其他模块中进行处理,此时计时器开始计时,1000毫秒后将回调函数放入任务队列中,等待调用栈执行完毕后开始执行。

关于事件循环机制详见 深入浅出Javascript事件循环机制(上) - 知乎专栏


当setTimeout和Promise放在一起的时候,由于Promise的任务队列的优先级更高,所以在处理宛调用栈中的任务后,会先处理Promise所在的任务队列。所以输出结果为 1 2 3 5 4 而不是  1 2 3 4 5

关于这道题更详细的解释可以参考从Promise来看JavaScript中的Event Loop、Tasks和Microtasks

高通SDX35平台 modem启动异常分析 SDX35 MIFI项目在生产时出现modem反复重启问题。经排查发现是modem在初始化GNSS模块时访问了不存在的硬件地址导致崩溃,原因是产线使用的SDX35 000-AB型号芯片阉割了GNSS功能,而本地测试使用的AA型号支持该功能。解决方案是通过修改modem编译选项,采用高通新提供的genlmm2选项(保留IMS和SMS功能但去除GNSS支持),最终解决了启动异常问题并满足VZW认证需求。 阅读详情

相关推荐

Comsol超声空化气泡仿真入门:从零搭建模型到网格划分的完整流程

本文详细介绍了使用Comsol进行超声空化气泡仿真的完整流程,从物理基础理解到模型搭建、网格划分及求解器设置。通过具体步骤和示例代码,帮助初学者和工程师快速掌握这一关键技术,应用于医疗设备和工业清洗等领域。

weixin_29289821的博客 166

setTimeout、Promise 性能比较

setTimeout 属于宏任务(MacroTask), Promise 属于微任务(MicroTask),二者并不在一个异步队列中。 无论是宏任务还是微任务,都是异步任务。在 JavaScript 中的异步是靠事件循环来实现的,拿大家最常见的 setTimeout 为例。 // 同步代码 let count = 1; setTimeout(() => { // 异步 count = 2; }, 0); // 同步 count = 3; 一个异步任务会被丢到事件循环的队列中..

chengRantianxia的博客 1945

虚拟机扩容——非LVM分区

虚拟机扩容——非LVM分区

ytraister的博客 3905

三极管混频器设计:利用FM相干子载波恢复技术实现SSB信号发射

混频器是射频电路中的核心器件,其基本原理是利用非线性器件实现频率变换,将两个输入信号的和频与差频分量产生出来。在通信系统中,混频器是实现上变频、下变频以及调制解调的关键。其技术价值在于能够高效地进行频谱搬移,为信号处理提供基础。典型的应用场景包括无线电收发机、雷达系统以及软件定义无线电平台。本文聚焦于一种经典的工程实践:使用低成本的三极管设计混频器,并深入探讨如何利用相干子载波恢复技术,从调频广播信号中提取隐藏的相位信息,最终在137.78MHz业余频段生成单边带信号。这一过程深刻体现了信号侦察与信息重构的

weixin_33922670的博客 465

SAP S4业务伙伴(BP)实战指南:从角色分配到数据同步的完整流程

本文详细解析了SAP S4业务伙伴(BP)功能,从基础概念到实战操作,涵盖角色分配、数据同步及常见问题排查。通过BP机制,企业可高效管理客户、供应商等多重身份,实现数据共享和动态切换,显著提升主数据管理效率。特别适合SAP实施顾问和ERP管理员参考。

y2z3a4b5c的博客 870

无感无刷电机控制进阶:反电动势过零检测的5种实现方案对比

本文深入探讨无感无刷电机控制中反电动势过零检测的5种实现方案,包括电阻分压虚拟中性点法、专用BEMF检测IC方案、基于ADC采样的数字锁相环、无传感器观测器技术及混合方案创新实践。通过对比分析各方案的优劣及适用场景,为电机控制工程师提供实用的技术选型指南,助力提升系统性能与成本效益。

weixin_28691741的博客 848

浅谈Promise与Settimeout

Promise和setTimeout

qq_48314377的博客 1160

2026年数据中心运行与管理专业人才培养基地建设方案(高职、数据中心运行与管理新专业、人才培养、专业代码:510310)

摘要: 为响应国家“东数西算”战略和数字经济需求,我校拟联合行业领军企业建设数据中心运行与管理人才培养基地。项目基于国家政策引导和产业快速发展背景,针对行业10万人才缺口,对标教育部新设专业标准(510310),分三阶段实施五年规划:专业奠基(2026-2028)、内涵深化(2028-2029)、辐射引领(2030-2031)。建设内容涵盖校企协同岗位能力分析、模块化课程开发(如网络管理、自动化运维等)、实训基地搭建及“课证融通”培养模式,重点培养基础设施、网络服务、运维托管三类岗位技能人才,目标建成区域性

啊碧根果的博客 1690

js后面代码停止一秒执行_JS事件循环机制

JS中存在一个叫做执行栈的东西。JS的所有同步代码都在这里执行,当执行一个函数调用时,会创建一个新的执行环境并压到栈中开始执行函数中的代码,当函数中的代码执行完毕后将执行环境从栈中弹出,当栈空了,也就代表执行完毕。这里有一个问题是代码中不只是同步代码,也会有异步代码。当一个异步任务执行完毕后会将任务添加到任务队列中。例如:setTimeout(_=>{}, 1000)代码中setTimeou...

weixin_39946239的博客 4529

线上专利申请(超详细)| 签名确认

在【法人登录】页面点击【证书登录】按钮,弹出证书登录提示框,点击【确 认】按钮,进入到输入证书密码页面,点击【取消】按钮,取消本次操作。企业在提交申请时,需要增加签名,如使用企业账户点击提交,会弹出“法人、代理机构不能签名,请使用经办人签名”,这个时候就需要换个账号了。在需要签名时,将专利官网的登录方式点击法人登录,选择扫码登录,使用移动端经办人账户的扫一扫功能扫描登录。登录完成后,再点击签名,使用移动端扫一扫功能,扫描签名,输入证书号,确认签名,并提交。最后,祝大家的申请都成功!

weixin_62112323的博客 9112

天龙八部TLBB系列 - 网单用数据库修改为其他门派

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等) --- 天龙八部修改门派

空名先生 9430

最简单快速理解Promise与setTimeout

Promise MDN上的例子稍稍变化: var p = new Promise(function(resolve, reject){ setTimeout(function(){ resolve(&amp;amp;quot;foo&amp;amp;quot;); console.log(&amp;amp;quot;first&amp;amp;quot;); }, 1000); }); p.then(function(value){ console.log(v

Nana_9457的博客 2148

推荐一个直接用于项目开发的PID库!很好用,很稳定

关注、星标公众号,不错过精彩内容大家好,我是小麦。最近有朋友问到有没有现成的C语言PID库。当然有了!现在我就准备给大家安利一下了。一般同学会去某度上搜,看到各种各样版本的PID示例,或者...

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 9028

Promise 中 setTimeout 的使用

promise

热爱思考、活力满满、开朗爱笑的年轻人 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

关于async/await、promise和setTimeout执行顺序

前段时间领导给我们出了一道题,关于async/await、promise和setTimeout的执行顺序,网上查了查资料,这是头条的一道笔试题,记录一下,加深理解。 题目如下: async function async1() { console.log('async1 start'); await async2(); console.log('asnyc1 end'); } async...

yun_hou的博客 3万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【JS】Promise与setTimeout执行顺序

Promise与setTimeout执行顺序,宏任务与微任务,事件循环与任务队列

痕 ` 浅 605

Promise里的代码为什么比setTimeout先执行?

Promise里的代码为什么比setTimeout先执行? 下面是一段代码,分析下面这段代码: var r = new Promise(function(resolve, reject){ console.log("a"); resolve() }); setTimeout(()=>console.log("d"), 0) r.then(() => console.log(...

htong521的博客 1538

setTimeout Promise

setTimeout(function() { console.log("1") setTimeout(function() { console.log('2') setTimeout(function() { console.log('3') setT...

StruggleK的博客 185

为什么 Promise 比 setTimeout 先执行?——JavaScript 事件循环与异步顺序完全指南

JavaScript 异步回调的乱序问题源于事件循环机制中微任务和宏任务的优先级差异。本文深入剖析了 Event Loop 的核心机制,揭示了异步回调乱序的根本原因:微任务(如 Promise.then)总在当前宏任务结束后立即执行,而宏任务(如 setTimeout)则需等待下一轮事件循环。通过典型代码示例展示了混合使用微任务和宏任务导致的执行顺序混乱,并提供了解决方案:统一使用 Promise 链或 async/await 控制异步顺序,或将宏任务封装为微任务。这些方法能确保异步操作的执行顺序符合预期,

csdn_silent的博客 1059

JavaScript中的Promise与setTimeout执行顺序解析

Promise对象代表一个异步操作的最终完成或失败,及其结果值的状态。当我们在代码中同时使用Promise和setTimeout时,由于Promise是微任务(microtask),而setTimeout是宏任务(macrotask),根据JavaScript的事件循环机制,微任务会优先于宏任务执行。由于Promise链中的每个步骤都是异步的,并且微任务会在当前宏任务执行完毕后立即执行,因此Promise链中的代码通常会先于setTimeout中的代码执行,即使setTimeout的延迟时间被设置为0。

让每一行代码都有改变世界的力量 1991

JS关于Promise和setTimeout的那些事儿

JS关于Promise和setTimeout的那些事儿 话不多说先上题: new Promise(res=>{ setTimeout(()=>{console.log(000)},0) res() }).then(res=>{setTimeout(()=>{console.log(11111)},0)}) setTimeout(()=>{console.log(2222222)},0) 输出是这个样子: 前端面试里面,这个知识点是非常常考的。 具体跟事件循环,主线程,任务

qq_41135011的博客 1332

Promise和setTimeout执行顺序

Promise.then()先执行 setTimeout后执行 看一个示例:

Lc_style的博客 1342

Promise为什么比setTimeout先执行?

emmmm…遇到一题目,promise为什么比setTimeout先执行,查阅了很多文档基本都是说了事件循环的大概的理念,都没有根据事件循环的概念深入解释promise比setTimeout先执行的原因。实在不太喜欢半吊子的解释,也有可能是自己理解不太透彻,简单的整理下原因。 setTimeout(function(){console.log(1)},0); new Promise...

MichelleZhai的博客 1531

promise和setTimeout执行顺序的问题

欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 promise为es6引进的语言标准,为异步编程的一种解决方案; 阅读此文的前提是了解promise的基本用法和特性,比如他自执行特性、状态不可逆特性等 抛出问题 且看下面代码和问题 setTimeout(function(){console.log(1)},0); new Promise(fu...

积少成多 1万+

promise和setTimeout的执行顺序

一、前言 promise为es6引进的语言标准,为异步编程的一种解决方案; 阅读此文的前提是了解浏览器event loop的机制,还有promise的基本用法和特性,比如他自执行特性、状态不可逆特性等 二、问题 setTimeout(function(){console.log(1)},0); new Promise(function(resolve){ console.log(2) for( var i=0 ; i<10000 ; i++ ){ i==9999 &am

allen_csdns的博客 1165

promise和setTimeout的执行机制

由于JavaScript是单线程执行,当主线程执行完当前所有任务后才会去任务队列中取出任务执行。另外,值得注意的是,当setTimeout的时间设为0时,相当于直接将目标函数加入到了任务队列中,但它的执行顺序也会受到当前主线程任务的影响。MacroTask和MicroTask的执行流程是一个交替执行的过程,代码块执行的时候,按顺序放入异步任务,如果检测到MicroTask,那么将执行它,第一个异步任务结束后会检查是否有同类任务,如果有就继续执行,没有则检查另一类任务是否存在,直至异步任务全部执行完毕。

kar98km416的博客 833

setTimeout+Promise+Async输出顺序?

其实不难,JavaScript代码执行机制,我就归结为三句话 1、遇到同步代码直接执行 2、遇到异步代码先放一边,并且将他回调函数存起来,存的地方叫事件队列 3、等所有同步代码都执行完,再从事件队列中把存起来的所有异步回调函数拿出来按顺序执行

广漂程序猿DevinRock 790
上一篇: 问题总结(1)
下一篇: 4类 JavaScript 内存泄漏及如何避免
CodingBleeding
博客等级 码龄10年 1粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值