如何秒杀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");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/14701.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git pull 出错 fatal: bad object refs/remotes/origin/xxxxx

使用git pull时出现以下问题 fatal: bad object refs/remotes/origin/xxxxx error: https://github.com/xxxxxx.git did not send all necessary objects解决办法 删除项目目录 .git\refs\remotes\origin 下面的所有文件 在 git pull 参考链接 How to handle git gc fatal: b…

5.23.9 TransUNet:Transformers 为医学图像分割提供强大的编码器

TransUNet&#xff0c;它兼具 Transformers 和 U-Net 的优点&#xff0c;作为医学图像分割的强大替代方案。一方面&#xff0c;Transformer 对来自卷积神经网络 (CNN) 特征图的标记化图像块进行编码&#xff0c;作为用于提取全局上下文的输入序列。另一方面&#xff0c;解码器对…

css去除复选框默认样式

HTML: <input type"checkbox" id"myCheckbox" class"custom-checkbox" /> <label for"myCheckbox" class"checkbox-label">自定义复选框</label> CSS: /* 隐藏默认复选框 */.custom-checkbox { -webk…

Go知识点复习

Go知识点复习 1.关于包的使用和GOPATH的配置 src:用于以代码包的形式组织并保存Go源码文件, 需要手动创建pkg目录&#xff1a;用于存放经由go install命令构建安装后的代码包&#xff08;包含Go库源码文件&#xff09;的“.a”归档文件bin目录&#xff1a;与pkg目录类似&…

C++学习-hello word

#include "iostream" #预处理指令 using namespace std; #预处理指令 int main() #程序执行从这里开始 {cout << "Hello, World!" << endl; #逻辑代码&#xff08;具体的功能代码&#xff09;return 0; …

国家开放大学,javaScript程序设计-形考任务-实训五:设计登录和注册页|实训六:设计简单的购物车

实训五&#xff1a;设计登录和注册页 1. 题目 设计登录和注册页。 2. 目的 &#xff08;1&#xff09;掌握表单域的引用方法。 &#xff08;2&#xff09;掌握常用控件的基本方法。 &#xff08;3&#xff09;掌握事件的处理方法。 &#xff08;4&#xff09;理解Cookie…

tomcat三级指导

版本 ./catalina.sh linux version.bat win 1.确认是否使用了tomcat管理后台 我们先找到配置文件&#xff1a;tomcat主目录下/conf/server.xml 可以查看到连接端口&#xff0c;默认为8080 然后查看manager-gui管理页面配置文件&#xff0c;是否设置了用户登录 配置文件…

如何创建 Gala Games 账户:解决 Cloudflare 验证指南 2024

Gala Games 站在数字娱乐新时代的前沿&#xff0c;将区块链技术与游戏相结合&#xff0c;重新定义了所有权和奖励。本文将引导您创建 Gala Games 账户并使用 CapSolver 解决 Cloudflare 验证难题&#xff0c;确保您顺利进入这一创新的生态系统。 什么是 Gala Games&#xff1f…

CRMEB开源商城标准版系统前端技术架构与实践探索

摘要&#xff1a; 随着电子商务的蓬勃发展&#xff0c;开源商城系统因其灵活性、可扩展性和成本效益受到了广泛关注。本文以CRMEB开源商城系统为例&#xff0c;探讨了其前端技术架构、开发实践及未来展望。通过对CRMEB系统前端技术的深入分析&#xff0c;旨在为开发者提供有价值…

JS的for循环中的var 和 let

在js的嵌套for循环异步执行&#xff0c;声明 i 和 使用 i 获取到的变量 都要用 let 声明&#xff0c;不要用var。 除非封装一个函数&#xff0c;把参数传进去调用&#xff0c;才能避免var使用最后一个变量&#xff0c;没必要。 同步 vs 异步: Java.perform 本身是同步执行的。…

筛斗数据:文档识别技术在教育行业的影响

随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经在各个领域产生了深远的影响。其中&#xff0c;文档识别技术作为人工智能的一个重要分支&#xff0c;在教育行业中也发挥着越来越重要的作用。本文将探讨文档识别技术在教育行业中的应用及其带来的影…

Android的init.rc文件重启会回到原始状态

Android系统中的init.rc文件是一个初始化语言脚本&#xff0c;它在系统启动时由init进程读取并执行&#xff0c;用于启动服务和管理设备。如果您在Android设备上直接编辑了init.rc文件&#xff0c;然后重启设备&#xff0c;发现修改未保存&#xff0c;这是由于Android系统的启动…

vmware - 主机向虚拟机拷贝文件的临时方法

文章目录 vmware - 主机向虚拟机拷贝文件的临时方法概述笔记确认主机/虚拟机之间网络是通的在虚拟机中新建一个文件夹(e.g. c:\test), 将这个文件夹设为共享文件夹。查看虚拟机中的当前用户(远程登录要用)远程登录备注 - win8.1只能用mstscEND vmware - 主机向虚拟机拷贝文件的…

04_闭包 (JS高级)

目录 一、闭包是什么 二、常见的闭包 三、闭包的作用 四、闭包的生命周期 五、闭包的应用 5.1、定义JS模块方式一 5.2、定义JS模块方式二 六、闭包的缺点及解决 七、经典习题 一、闭包是什么 闭包&#xff08;closure&#xff09;是一个嵌套的内部函数以及它所引用环境的…

网络模型-单臂路由配置相关命令

一、单臂路由配置相关命令 执行命令system-view&#xff0c;进入系统视图. 执行命令interface interface-type interface-number&#xff0c;进入接口视图, 执行命令port link-type {hybrid |trunk}&#xff0c;配置端口类型。 执行命令quit&#xff0c;退出接口视图。 执…

游戏行业 2024 Q1报告 | 国内同比上升7.6%,海外收入同比环比双增长,码住!

作为中国音像与数字出版协会主管的中国游戏产业研究院的战略合作伙伴&#xff0c;伽马数据发布了《2024年1—3月中国游戏产业季度报告》。 数据显示&#xff0c; 2024年1—3月&#xff0c;中国游戏市场实际销售收入726.38亿元&#xff0c;同比增长7.60%&#xff0c;主要受移动游…

Python面试宝典:Python中与异步编程和协程相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第二部分:Python高级特性:第十三章:并发编程:第三节:异步编程和协程】 第十三章:并发编程第三节:异步编程和协程异步编程和协程相关的知识异步编程基础异步函数(async function)等待协程(awaiting a corou…

信息系统项目管理师--八大绩效域-项目工作绩效域

信息系统项目管理师的八大绩效域包括&#xff1a;干系人、团队、开发方法和生命周期、规划、项目工作、交付、不确定性、度量。 项目工作绩效域涉及项目工作相关的活动和职能。 预期目标 1、高效且有效的项目绩效 2、适合项目和环境的项目过程 3、干系人适当的沟通和参与 …

【Linux】详解线程控制之线程创建线程终止线程等待线程分离

一、线程创建 thread&#xff1a;这是一个指向pthread_t类型的指针&#xff0c;用于获取新创建线程的线程ID。在调用pthread_create后&#xff0c;这个指针会被设置为新线程的ID。 attr&#xff1a;这是一个指向pthread_attr_t类型的指针&#xff0c;用于设置线程的属性&#x…

【OpenGL纹理】纹理贴图基础知识(01/4)

文章目录 一、说明二、贴图的初始化处理2.1 贴图中的几种纹理2.2 原始数据处理 - 贴图的规格化 三、纹理对象生成和绑定&#xff08;选中&#xff09;3.1 生成纹理矩阵3.2 glGenTextures 函数明细3.2 glBindTexture函数明细 四、glTexParameteri函数4.1 贴放放法参数确定4.2 放…