如何秒杀Promise面试题
如何秒杀Promise面试题
如果你在面试的时候技术面给你出了点关于Promise的面试题首先不要慌,先问候他爹妈一套问候语!
然后切记不要(ps:这是病句别在意!🤣) 自己想 找他要纸和笔
首先关于promise的面试题无非就是 promise 的状态和宏队列、微队列
看一道题:(小试牛刀😀)
const promise = new Promise((resolve, reject) => {console.log(1);resolve(5);console.log(2);
});
promise.then(() => {console.log(3);
});
console.log(4);
// The output is 1, 2, 4, 3.
Remeber:在javascript中代码都是一行一行执行的 什么队列任务都是噱头
解析:
开始执行任务
第一步声明
第二步new Promise 传入回调函数 并且赋值 (传入的回调就直接执行了 输出1 promise状态为pending)
第三步resolve(5) promise状态为fulfilled
第四步 输出2
第五步 promise.then 当promise成功后请执行他的回调 但是注意 promise的then方法是要放入微队列的
第六步 不管队列 继续跑全局任务队列 输出4
第七步 执行微队列 输出3
所以答案是:1,2,4,3.
经过上面的学习我们知道
js首先执行全局任务 遇到then 放到微队列中 继续执行全局任务 当全局任务没有任务后 执行微队列!
看一道题:(小试牛刀😀)
const promise = new Promise((resolve, reject) => {console.log(1);setTimeout(() => {console.log(2);resolve();console.log(3);},1000);});promise.then(() => {console.log(4);});console.log(5);
解析:
new --> 输出1 --> setTimeout加入宏任务 --> 等待setTimeout执行到resolve then加入微队列 --> 输出5
注意 执行顺序 全局任务 --> 微任务 --> 宏任务 (当微任务没有可以执行的任务的时候才会先执行宏任务)
答案为:1,5,2,3,4
why?当执行到setTimeout加入宏任务 人家then还没加微任务呢 此刻微任务为空 咋不执行宏任务呢是不是!
经过上面的学习我们知道
执行顺序 全局任务 --> 微任务 --> 宏任务
看一道题:(小试牛刀😀)
setTimeout(() => {console.log(1);
}, 1000);
const promise = new Promise((resolve, reject) => {console.log(2);resolve();
});
promise.then(() => {console.log(3);
});
console.log(4);
解析:
setTimeout进入宏任务 --> new直接执行 输出2 完成promise --> then进入微任务 --> 输出4
答案:2 4 3 1
看一道题:(小试牛刀😀)
const promise1 = new Promise((resolve, reject) => {setTimeout(() => {resolve();}, 1000);
});
const promise2 = promise1.catch(() => {return 2;
});
console.log("promise1:", promise1);
console.log("promise2:", promise2);
setTimeout(() => {console.log("promise1:", promise1);console.log("promise2:", promise2);
}, 2000);
解析:
promise1 :pending
一秒后运行回调
promise1失败后运行回调
promise2:pending
console.log("promise1:", promise1);--->pending
console.log("promise2:", promise2);--->pending
两秒后运行回调
现在一秒到了 promise1:fulfilled
console.log("promise1:", promise1);--->fulfilled值为undefine
console.log("promise2:", promise2);--->现在promise1完成了你promise2没有对成功处理 所以你promise2 直接就用promise1的状态去处理 所以为 fulfilled值为undefine
上面的案例教会我们:
catch 方法返回的是一个新的 Promise 对象 其状态由捕获的promise决定
看一道题:(小试牛刀😀)
async function m() {const res = await 1;console.log(res);
}
m();
console.log(2);
解析:
//改个写法你就知道了
function m() {return Promise.resolve(1).then((n) => {console.log(n);});
}
m();
console.log(2);
//.then 怎么样会进入微队列 暂不执行 先输出2 执行微队列然后输出1
看一道题:(小试牛刀😀)
async function m() {console.log(0);const n = await 1;console.log(n);
}
(async () => {await m();console.log(2);
})();
console.log(3);
解析:
立即执行函数执行 等待m运行完成 m开始运行 输出0 n进入微队列等待输出1 输出1不执行 m就一直等待 现在到全局执行 输出3
输出完成后是 0 3 然后执行微任务队列 输出1 此时m运行完成 立即执行函数 内部的m也就完成了 也就输出2 了
也就是 0 3 1 2
看一道题:(小试牛刀😀)
async function m1() {return 1;
}async function m2() {const n = await m1();console.log(n);return 2;
}async function m3() {const n = m2();console.log(n);return 3;
}m3().then((n) => {console.log(n);
});
m3();
console.log(4);
解析:
m3().then()执行后 :
m3调用m2 m2调用m1;
当本次调用来到m2的时候 他会进行await 不管你是什么状态都要进入微队列里面 console.log(n);也就是输出1 进入微队列;
当本次调用来到m3的时候 他没有用await 他不会等待直接输出 console.log(n); m2是用async标记的 直接就是返回一个promise <pending>(m2现在还在微队列中呢,没有完成);
当来到m3().then()的时候 又进入了微队列等待输出3小总结:m3().then()调用后 会输出一个 promise <pending> 微任务队列:等待输出1 等待输出3m3()执行后:
m3调用m2 m2调用m1;
m2等待输出1进入微队列 m3直接输出promise <pending> 所以结果是:promise <pending>
promise <pending>
4
1
3
1
看一道题:(小试牛刀😀)
Promise.resolve(1).then(2).then(Promise.resolve(3)).then(console.log);
秒杀小知识:当你看到Then的时候如果你发现传递的不是一个函数 你就可以删掉就完事了! 上面的then(2)删掉
Promise.resolve(1).then(console.log);//就这样看 Promise.resolve(3)是一个对象不是函数
答案等于:1
Promise.resolve(1).then((res) => {console.log(res);
});
Promise.resolve(1).then(console.log);
上面这俩哥们是等价的!
看一道题:(小试牛刀😀)
var a;
var b = new Promise((res, rej) => {console.log("Promise1");setTimeout(() => {res();}, 1000);
}).then(() => {console.log("Promise2");}).then(() => {console.log("Promise3");}).then(() => {console.log("Promise4");});a = new Promise(async (res, rej) => {console.log(a);await b;console.log(a);console.log("after1");await a;res(true);console.log("after2");
});
console.log("end");
解析:
await a;
res(true); 你等待不到结果的 别想了 after2不能输出
new 的时候直接输出 console.log("Promise1");
宏任务:
微任务: await b;
前期输出为:
Promise1
undefinde
end
Promise2
Promise3
Promise4
Promise<pending>
after1
看一道题:(小试牛刀😀)
async function async1() {console.log("async1 start");await async2();console.log("async1 end");
}async function async2() {console.log("async2");
}
console.log("srript start");setTimeout(() => {console.log("timeout");
}, 0);async1();new Promise((resolve, reject) => {console.log("promise1");resolve();
}).then(function () {console.log("promise2");
});
console.log("script end");
解析:
console.log("srript start");
console.log("async1 start");
console.log("async2");
console.log("promise1");
console.log("script end");
console.log("async1 end");
console.log("promise2");
console.log("timeout");宏任务: console.log("timeout");
微任务: console.log("async1 end"); console.log("promise2");
相关文章:
如何秒杀Promise面试题
如何秒杀Promise面试题 如果你在面试的时候技术面给你出了点关于Promise的面试题首先不要慌,先问候他爹妈一套问候语! 然后切记不要(ps:这是病句别在意!🤣) 自己想 找他要纸和笔 首先关于promise的面试题无非就是 promise 的状态和宏队列、…...
linux文件权限常用知识点,基于Linux(openEuler、CentOS8)
目录 知识点常用实例 知识点 真实环境文件显示 解读 常用实例 文件所有者 chown -R nginx:nginx /home/source目录权限(R选填必须大写<遍历子文件夹及文件>) chmod -R 755 /home/sourcechmod -R 777 /home/source...
【前端笔记】记录一个能优化Echarts Geo JSON大小的网站
前端在使用Echarts等可视化图表库会不可避免遇到的问题,渲染地图的数据太大。 而有那么一个网站能给予这个问题一个解决方案:链接在此 使用方法很简单,首先先进入网站,如果进入了会是这个页面: 接着,选择一…...
车与网络之间(V2N)简介
车与网络之间(V2N)简介 一、定义与概述 V2N,全称为Vehicle-to-Network,是指车辆与网络之间的通信和连接技术。这种技术使得车辆能够与互联网进行无缝连接,进而实现导航、娱乐、防盗等多种应用功能。在智能交通系统领…...
.Net Core WebAPI参数的传递方式
Controller继承自ControllerBase,只不过增加了视图相关的方法,一般mvc项目选用Controller而Web API项目选择ControllerBase即可。 给服务器传递参数的时候,有URL、QueryString、请求报文体3种方式 请求路径/Student/GetAll/school/MIT/class…...
10款免费黑科技软件,强烈推荐!
1.AI视频生成——巨日禄 网页版https://aitools.jurilu.com/ "巨日禄 "是一款功能强大的文本视频生成器,可以快速将文本内容转换成极具吸引力的视频。操作简单,用户只需输入文字,选择喜欢的样式和模板, “巨日禄”就会…...
DFS:解决二叉树问题
文章目录 了解DFS1.计算布尔二叉树的值思路代码展示 2.求根节点到叶节点数字之和思路代码展示 3.二叉树剪枝思路代码展示 4.验证二叉搜索树思路分析代码展示 5.二叉搜索树中第k小元素思路:代码展示 6.二叉树的所有路径思路分析代码展示 总结 了解DFS 所谓DFS就是就…...
【相机开发问题总结】曝光补偿ExposureCompensation未生效异常分析及解决
问题描述 做一款相机应用时,用户反馈相机预览界面太暗了,由于我们是嵌入式设备,没有手机那么高大上得闪光灯补光,因此只能考虑从软件层面提高界面亮度,还好找到了曝光补偿,但是开发过程中发现曝光补偿未生…...
Flutter 中的 DateRangePickerDialog 小部件:全面指南
Flutter 中的 DateRangePickerDialog 小部件:全面指南 在 Flutter 应用开发中,日期和时间的选择是一项常见的用户交互需求。DateRangePickerDialog 是一个方便的小部件,它提供了一个对话框界面,允许用户选择日期范围。这个小部件…...
MCS-51伪指令
上篇我们讲了汇编指令格式,寻址方式和指令系统分类,这篇我们讲一下单片机伪指令。 伪指令是汇编程序中用于指示汇编程序如何对源程序进行汇编的指令。伪指令不同于指令,在汇编时并不翻译成机器代码,只是会汇编过程进行相应的控制…...
vue3 vant4实现抖音短视频功能
文章目录 1. 实现效果2. 精简版核心代码3. 完整功能点(本文章不写,只写核心代码) 1. 实现效果 2. 精简版核心代码 使用的 vue3 vant4组件使用van-swipe进行轮播图切换实现 <template><div :style"{width: width px,overflo…...
C#结合JS实现HtmlTable动态添加行并保存到数据库
目录 需求 效果视频演示 范例运行环境 准备数据源 数据表设计 UI及表结构Json配置 Json数据包提交配置 设计实现 前端UI Javascript 脚本 Jquery引用 C# 服务端操作 小结 需求 在 Web 应用项目中,实现一对多录入的数据管理功能是一项常见的应用。因此…...
Unity Render Streaming 云渲染 外网访问
初版: 日期:2024.5.20 前言:临时思路整理,后期会详细补充 环境: 1. 阿里云服务器 需要安装好nodejs 、npm 2. windows电脑,需安装好 nodejs 、npm 3.Unity 2021.3.15f1 4.Unity Render Streaming …...
美易官方:Copilot全面升级!
Copilot的全面升级,无疑在科技界掀起了一场革命性的浪潮!微软在一夜之间推出的这50余项AI更新,不仅彰显了其在人工智能领域的深厚底蕴,更是让全球用户见证了计算机理解人类能力的一次飞跃。 在微软2024年Build开发者大会的主题演…...
深入了解FreeRTOS:实时操作系统的核心概念和应用
前言: 在当今数字化世界中,嵌入式系统扮演着至关重要的角色,从工业自动化到智能设备,无所不在。而实时操作系统(RTOS)则是这些系统的核心引擎,它们负责管理任务、资源和时间,确保系统…...
Spring框架学习笔记(五):JdbcTemplate 和 声明式事务
基本介绍:通过 Spring 框架可以配置数据源,从而完成对数据表的操作。JdbcTemplate 是 Spring 提供的访问数据库的技术。将 JDBC 的常用操作封装为模板方法 1 JdbcTemplate 使用前需进行如下配置 1.1 在maven项目的pom文件加入以下依赖 <dependencies…...
考研计组chap1计算机系统概述
目录 一、计算机发展历程(不考了) 二、计算机硬件的基本组成 3 1.五个部分 (1)输入设备 (2)控制器 (3)运算器 (4)(主)存储器 (5࿰…...
如何使用Python中的生成器
如何使用Python中的生成器 在Python中,生成器是一种特殊的迭代器,它允许你逐个地生成值,而不是一次性地计算并存储所有的值。这对于处理大量数据或者无限序列特别有用,因为它能够节省内存并提高效率。 生成器通常是通过以下两种…...
C语言 读取 MIDI文件头部
在C语言中直接读取MIDI文件并不简单,因为MIDI文件是一种包含音乐事件(如音符的开始和结束、控制信号等)的二进制格式,而不是像文本文件那样容易解析。不过,你可以通过以下步骤来实现: 了解MIDI文件格式&am…...
C# Winform实现五子棋游戏(代完善)
实现了基本的玩法。 BoardController.cs using System;namespace GomokuGame {public class BoardController{private static BoardController instance;private readonly int[,] board;private const int boardSize 15;private BoardController(){board new int[boardSize…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
