promise规范及应用(进阶)

news2024/12/26 23:28:40

##promise解析

*啥是异步?

        //异步执行
        let count = 1
        let timer = setTimeout(function () {
            count++
            console.log('in', count);
        }, 1000);
        console.log('out');
        // out=>1000=>in

        //循环执行
        let count = 1
        let 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.属于同步进入主线程 宏任务1
            resolve()
        }).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.默认状态-PENDING
                this.status = 'PENDING'
                //2.内部维护的变量值
                this.value = undefined
                this.reason = undefined

                //成功的回调
                let resolve = value => {
                    //状态流转
                    this.status = FULFILLED
                    this.value = value
                }

                //失败的回调
                let reason = reason => {
                    //状态流转
                    this.status = REJECTED
                    this.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.默认状态-PENDING
                this.status = 'PENDING'
                //2.内部维护的变量值
                this.value = undefined
                this.reason = undefined

                //存放回调
                this.onResolvedCallbacks = []
                this.onRejectedCallbacks = []

                //成功的回调
                let resolve = value => {
                    //状态流转
                    this.status = FULFILLED
                    this.value = value
                    this.onResolvedCallbacks.forEach(fn => fn())
                }

                //失败的回调
                let reason = reason => {
                    //状态流转
                    this.status = REJECTED
                    this.reason = reason
                    this.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.coloradmin.cn/o/771129.html

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

相关文章

isaac sim添加孔网格

isaac sim仿真和其它仿真实际上一样,对于孔的仿真,是没那么简单的 在此记录一下踩过的坑 1,首先,你需要在soildworks中将你的孔画出来,并导出stl 2,你可以在win10中使用3D画图查看孔的网格,看…

代码随想录算法训练营day7 | 454. 四数相加 II,383. 赎金信,15. 三数之和,18. 四数之和

目录 454. 四数相加 II 383. 赎金信 15. 三数之和 18. 四数之和 454. 四数相加 II 难度:medium 类型:哈希表 思路: 本题是使用哈希法的经典题目,而0015.三数之和 (opens new window),0018.四数之和 (opens new …

迁移 Gitee 仓库到 Github

Step1: 在Gitee找到你要迁移的仓库, 并复制 克隆|下载 链接 Step2: 打开 Github, 找到 按钮选择 Import Step3: 打开 Github, 找到 按钮选择 Import Step4: Waiting... 等待导入成功 Over~ 还有一种镜像更新的方案, Gitee 支持镜像同步, 但是我使用时无法获取到仓库名,…

开源的短视频生成和编辑工具 Open Chat Video Editor

GitHub - SCUTlihaoyu/open-chat-video-editor: Open source short video automatic generation tool

MySQL的四种主要存储引擎

目录 目录 目录 (一)MyISAM (二)InnoDB 1)自动增长列: 2)外键约束: (三)MEMORY (四)MERGE 什么是存储引擎? 对MySQL来说,它…

系列七、VMware中的CentOS服务不息屏

一、场景 VMware中安装好CentOS7等虚拟机后,过一段时间会自动息屏,这个时候如果想执行操作,需要重新输入 用户名/密码,体验感不好。 二、解决方法 应用程序》系统工具》设置》Privacy》锁屏》自动锁屏(关闭&#xff0…

Windows11 C盘瘦身

1.符号链接 将大文件夹移动到其他盘,创建成符号链接 2.修改Android Studio路径设置 1.SDK路径 2.Gradle路径 3.模拟器路径 设置环境变量 ANDROID_SDK_HOME

GRE和MGRE

目录 GRE GRE环境的搭建 MGRE MGRE的配置 MGRE环境下的RIP网络 MGRE实验 VPN 说到GRE,我们先来说个大家熟悉一点的,那就是VPN技术。 背景需求 企业、组织、商家等对专用网有强大的需求。 高性能、高速度和高安全性是专用网明显的优势。 物理专…

【数据结构】时间复杂度---OJ练习题

目录 🌴时间复杂度练习 📌面试题--->消失的数字 题目描述 题目链接 🌴解题思路 📌思路1: malloc函数用法 📌思路2: 📌思路3: 🌴时间复杂度练习 &…

具有吸引子的非线性系统(MatlabSimulink实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码&Simulink仿真实现 💥1 概述 要在Simulink中实现具有吸引子的非线性系统,可以按照以下步骤进行操作: 1. 打开Simulink并创建一个…

Nginx基础(复习理论篇)

一、Nginx基本概念 1、Nginx是什么 Nginx是一个高性能的Http和反向代理服务器,其特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现较好。 Nginx专为性能优化而开发,性能是其最重要的考量&…

Oracle/plsql报错ORA-01932:ADMIN选项未授权给角色‘CONNECT’

情况如下: create user hikeytdm identified by hikeytdm default tablespace hikeytdm temporary tablespace temp; grant connect,resource,dba to hikeytdm; --grant报错ORA-01932:ADMIN选项未授权给角色‘CONNECT’,应该在cmd里或plsql里…

pytorch学习--第一个模型(线性模型)

目标 我们想通过随机初始化的参数 ω , b \omega ,b ω,b能在迭代过程中使预测值和目标值能无限接近 y ω x b y\omega xb yωxb 定义数据 x torch.rand([60, 1])*10 y x*2 torch.randn(60,1)构建模型 利用pytorch中的nn.Module 想要构建模型时,继承这个类…

SylixOS下SSH和SFTP连接

简要 基于网络的连接(telnet,ftp)方便高效,但其是基于明文的通信,容易被窃取、篡改和攻击,存在网络安全问题,尤其在进行远程访问时,穿过复杂未知的公网环境非常危险,为此…

linux之Ubuntu系列(八)用户管理 修改文件权限

修改文件权限 chown 修改拥有者 修改 文件|目录 的拥有者 sudo chown 用户名 文件名|目录 递归修改文件|目录的组 sudo chgrp -R 组名 文件|目录 递归修改文件权限 chmod -R xxx 文件|目录

mongoDB 分组汇总统计-执行语句(亲测)

# 注意 “gl_id” 需要分组的字段名 “gl_idlCount” 分组后获取数量的字段名(可随意命名) db.getCollection(集合名).aggregate([{ "$group": {"_id": {"gl_id": "$gl_id"},"gl_idlCount": { "…

一文读懂FPC(16)- 关于过孔盖油和过孔开窗的区分

FPC系列文章目录 1.什么是FPC 2.什么是R-FPC 3,FPC的基材 4.FPC基材压延铜和电解铜的区别 5,FPC的辅材 6,FPC常见的四种类型 7,FPC的生产流程简介 8,R-FPC的生产流程简介 9,FPC的发展及应用 10&a…

优思学院|六西格玛管理:依据事实的质量管理方式

一个企业的质量管理制度是否规范,也就是质量管理体系是否很完备的问题,要考察管理体系是否还有哪里不尽完美?各部门之间的连系、调整是否能够顺利进行?各自是否达成在质量保证上的任务等,进行质量管理体系的审核&#…

【无线通信模块】什么是PCB板载天线,PCB板载天线UART/USB接口WiFi模块

基于射频技术的无线模块需要通过天线来发射和接收电磁波信号,市场上常见的天线类型有陶瓷天线、板载天线、棒状天线以及外接天线,外接天线是通过在PCB板上预留IPEX座子,可选天线类型就比较多。本篇SKYLAB小编带大家了解一下板载天线的UART接口…

ROS:pluginlib

目录 一、前言二、概念三、作用四实际用例4.1需求4.2流程4.3准备4.4创建基类4.5创建插件4.6注册插件4.7构建插件库4.8使插件可用于ROS工具链4.8.1配置xml4.8.2导出插件 4.9使用插件4.10执行 一、前言 pluginlib直译是插件库,所谓插件字面意思就是可插拔的组件&…