promise规范及应用(进阶)

##promise解析

*啥是异步?

        //异步执行let count = 1let timer = setTimeout(function () {count++console.log('in', count);}, 1000);console.log('out');// out=>1000=>in//循环执行let count = 1let timer = setInterval(function () {count++console.log('in', count);}, 1000);console.log('out');setTimeout(function () {clearInterval(timer)console.log('clear');//第5秒后清空循环器}, 5000);//看不见的队列,存放着需要默默执行的命令

###1.进程&线程

####a.概念 & 区别

####b.面试题

*映射到前端-浏览器

chrome新开一个窗口,是进程还是线程(可以理解为互相协作,相互之间独立)?=>进程(可以理解为完整的独立体系)

*发散

方向一:窗口(进程间)通信?=>storage | cookie=>多种存储的区别=>应用场景=>结合简历项目

方向二:浏览器原理(中高级岗位面试居多)

###2.EVENT-LOOP

####a.执行栈

*js单线程语言,单步执行

        function func2() {throw new Error('please check your call stack');}function func1() {func2() }function func() {func1()}func()

 ####b.面试题

        //    执行顺序setTimeout(() => {console.log('count');//5.宏任务2}, 0);new Promise(resolve => {console.log('new Promise');//1.属于同步进入主线程 宏任务1resolve()}).then(() => {console.log('Promise then');//3.微任务1}).then(() => {console.log('Promise then then');//4.微任务2})console.log('hi');//2.同步+宏任务1//任务拆分 : macro | micro//同步 | 异步

event-table:可以.理解为异步待执行

event queue:异步队列

同步的走同步的执行栈,异步的走异步的事件队列.

###promise化=>链式化

####a.理论-回调地狱

       request.onreadystatechange = () => {//回调后处理}//加时延setTimeout(() => {request.onreadystatechange = () => {//回调后处理setTimeout(() => {//处理request.onreadystatechange = () => {//......}});}});//promise化new Promise((resolve, reject) => {setTimeout(() => {resolve('ok')});}).then(res => {request()}).catch(err => {console.log(err);})

 多个异步顺序执行=>复合链式调用

       function wait500(input) {return new Promise((resolve, reject) => {setTimeout(() => {resolve(input + 500)}, 500);})}function wait1000(input) {return new Promise((resolve, reject) => {setTimeout(() => {resolve(input + 1000)}, 1000);})}const p = new Promise((resolve, reject) => {resolve(1)})p.then(wait500).then(wait1000).then(wait500).then(wait1000).then(res => {console.log('end', res);})//全部执行完成回调Promise.all([wait500, wait1000]).then(res => {console.log('all end', res);})//有执行完成的立刻操作Promise.race()([wait500, wait1000]).then(res => {console.log('all end', res);})

####b.面试-promise

*1.promise状态 - pedding | fulfilled | rejected

executor(执行器):new Promise的时候立即执行,接收两个参数,resolve | rejected

*2.promise默认状态?状态是如何流转的?-默认是pedding,状态流转:pedding=>fulfilled | pedding=>rejected

内部维护成功value:underfined | thenable | promise

内部维护失败原因resaon

*3.promise返回值?-then方法:接收onFulfilled和onRejected

如果then时,promise已经成功,执行onFulfilled,参数value

如果then时,promise已经失败,执行onRejected,参数resaon

如果then中有异常,执行onRejected

*追问:手写?

        const PENDING = 'PENDING'const FULFILLED = 'FULFILLED'const REJECTED = 'REJECTED'class Promise {constructor(executor) {//1.默认状态-PENDINGthis.status = 'PENDING'//2.内部维护的变量值this.value = undefinedthis.reason = undefined//成功的回调let resolve = value => {//状态流转this.status = FULFILLEDthis.value = value}//失败的回调let reason = reason => {//状态流转this.status = REJECTEDthis.reason = reason}try {executor(resolve, reject)} catch (error) {reject(error)}}then(onFulfilled, onRejected) {if (this.status === FULFILLED) {onFulfilled(this.value)}if (this.status === REJECTED) {onFulfilled(this.reason)}}}//异步怎么办?const PENDING = 'PENDING'const FULFILLED = 'FULFILLED'const REJECTED = 'REJECTED'class Promise {constructor(executor) {//1.默认状态-PENDINGthis.status = 'PENDING'//2.内部维护的变量值this.value = undefinedthis.reason = undefined//存放回调this.onResolvedCallbacks = []this.onRejectedCallbacks = []//成功的回调let resolve = value => {//状态流转this.status = FULFILLEDthis.value = valuethis.onResolvedCallbacks.forEach(fn => fn())}//失败的回调let reason = reason => {//状态流转this.status = REJECTEDthis.reason = reasonthis.onRejectedCallbacks.forEach(fn => fn())}try {executor(resolve, reject)} catch (error) {reject(error)}}then(onFulfilled, onRejected) {if (this.status === FULFILLED) {onFulfilled(this.value)}if (this.status === REJECTED) {onFulfilled(this.reason)}if (this.status === PENDING) {//存放队列this.onResolvedCallbacks.push(() => {onFulfilled(this.value)})this.onRejectedCallbacks.push(() => {onFulfilled(this.reason)})}}}

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

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

相关文章

【C++修炼之路】list 模拟实现

👑作者主页:安 度 因 🏠学习社区:StackFrame 📖专栏链接:C修炼之路 文章目录 一、读源码二、成员三、默认成员函数1、构造2、析构3、拷贝构造4、赋值重载 四、迭代器五、其他接口 如果无聊的话,…

【学会动态规划】解码方法(4)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…

跟我一起从零开始学python(九)numpy+pandas+matplotlib

前言 回顾之前讲了python语法编程 ,必修入门基础和网络编程,多线程/多进程/协程等方面的内容,后续讲到了数据库编程篇MySQL,Redis,MongoDB篇,和机器学习,全栈开发前面没看的也不用往前翻&#…

macos使用搭建算法竞赛c/c++的g++/gcc编译环境(homebrew,含万能头,改环境变量,vscode/clion可用)

文章目录 1、homebrew安装2、安装g3、改环境变量 1、homebrew安装 我没改镜像,直接网上脚本一键安装的,具体命令忘了,可能是这个 反正装这个的方法很多,网上一搜都有。 成功装上homebrew就行。 /bin/bash -c "$(curl -fsSL…

Acwing.905 区间选点(贪心)

题目 给定N个闭区间[a,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数N,表示区间数。 接下来N行,每行包含两个整数…

【QT】元对象系统学习笔记(一)

QT元对象系统 01、元对象系统1.1、 元对象运行原则1.2、 Q_OBJECT宏1.3、 Qt Creator启动元对象系统1.4、 命令行启动元对象(不常用) 02、反射机制2.1、 Qt实现反射机制2.2、 反射机制获取类中成员函数的信息2.1.1、 QMetaMethon类2.1.2、QMetaObject类 …

如何快速又高质量的输出PDF实验报告?

摘要:本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 PDF文档的打印在很多应用场景中都会被使用到,最为常见的就是实验室信息管理…

xred病毒分析

概述 xred病毒是一种感染型病毒,会感染系统中特定目录下的exe和xlsx文件,该病毒会将自身伪装成Synaptics触摸板驱动程序,使用Dephi编写。 样本的基本信息 Verified: Unsigned Link date: 6:22 1992/6/20 Company: Synaptics Description: S…

华南农业大学|图像处理与分析技术综合设计|题目解答:定位数显区域并分离电表数字

设计任务 图 28 是一幅正在运行的数字电表图像(ipa28.jpg),试采用图像处理与分析 技术,设计适当的算法和程序,找出电表的数显区域,计算目标区域的长宽比 和像素面积;并提取其中面积最大的 …

Service:微服务架构的应对之道

Service 的工作原理和 LVS、Nginx 差不多,Kubernetes 会给它分配一个静态 IP 地址,然后它再去自动管理、维护后面动态变化的 Pod 集合,当客户端访问 Service,它就根据某种策略,把流量转发给后面的某个 Pod。 Service 使…

Docker把公共镜像推送到harbor私服的流程(企业级)

如果构建项目时,使用了k8s docker Jenkins的模式。 那么我们在docker构建镜像时,如果需要使用了Nodejs,那么我们必须得从某个资源库中拉取需要的Nodejs。 在企业里,正常都会把自己项目涉及的库都放在harbor私服里。 下面讲一下&…

珠海电子行业实行MES系统该如何规划 mes系统供应商 先达盈致

在电子行业中,MES系统是提高生产效率、降低成本、优化生产计划的关键工具。但是,如何规划MES系统的实施才能使其大限度地提高企业的生产效率和经济效益呢? 首先,企业应该充分了解MES系统的基本概念和功能模块。MES系统中包括生产…