经典面试题第九更---Promise养猪场

news2025/9/19 20:11:57

前言:
    🤡 作者简介:我是Morning,计算机的打工人,想要翻身做主人 🙈 🙈 🙈
    🏠 个人主页:  Morning的主页
    📕系列专栏: 前端面试备战
    📞 如果小编的内容有欠缺或者有改进,请指正拙著。期待与大家的交流
    🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏

 

 前言

Promise对于我自己来说,一直都处于一个仅限于只会用的状态,什么时候用,有什么好处等等差太远,根本不了解它。就只是在做项目中照葫芦画瓢的用Promise写需求。

但是在意识到JS基础重要性后,我就开始恶补JS基础,也就是这个专栏的来源。在学习之后,我与大家来分享一下我的心得

1.含义

Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

而这个结果可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

而且状态改变过之后就不会再发生改变。Promise对象的状态改变,只有两种可能:pending变为fulfilled  和      从pending变为rejected

大白话来讲,Promise像是一个养猪场。new Promise就相当于养了一头新🐖,这头猪猪正在成长中(pending),这个🐖有两种结果,要么长大了(fulfilled),要么病死了(rejected)。二者只有一种可能

2.为甚么使用Promise

当一个请求需要依赖上一个请求返回结果的时候,就会形成类似这样的调用结构,我看见都瑟瑟发抖,又难看,又难维护。很容易出现回调地狱(Callback Hell)

于是Promise就诞生了,用于优雅的表达异步回调 

请求一(function(结果一){
        请求二(function(结果二){
            请求三(function(结果三){
                请求四(function(结果四){
                    ......
                })
            })
        })
    })

3.基本使用

Promise是一个构造函数,所以调用时通过new来使用,传入函数类型的参数

resolve函数的作用是,将Promise对象的状态从“进行中”变为“成功”(即从 pending 变为 resolved),并将运行成功的结果作为参数传递出去;

reject函数的作用是,将Promise对象的状态从“进行中”变为“失败”(即从 pending 变为 rejected),并将报出的错误,作为参数传递出去。

new Promise((resolve,reject)=>{
        if(🐖长大了){
            resolve()
        }else{//🐖病死了
            reject()
        }
    })

4. then、catch、finally的诞生及静态方法

为了更好的控制下一步执行,Promise还拥有三个实例方法 then   catch    finally

then方法用来控制接下来干什么,支持链式调用。养了一头新🐖后,长大--->杀猪--->剃毛--->工厂加工猪肉--->火腿肠。then的执行必须依赖上一步的结果(比如想吃火腿肠就必须先让工厂加工),以上每一个过程都会出现两种结果,因此then又会接收两种结果(resolve对应成功 reject对应失败)。但是每一次都写reject就特别麻烦

于是诞生了catch方法,在.then()之后来.catch(),用来处理reject的情况,而且还可以监听resolve中的异常情况(监听以上任意过程的出错)

但是有时候无论是resolve还是reject(无论🐖长大了还是病死了),都需要执行一些方法,就诞生了finally方法 。

此外为了满足更多的开发需求,就诞生了一些静态方法

all:所有🐖都长大才执行

allSettled:所有🐖都有结果了就执行,无论死活

any:任意一头🐖养成就执行

race:任意一头🐖养成或病死了就执行

reject:返回一个状态为rejected的Promise对象

resolve: 

5.简单实例

const promise = new Promise((resolve, reject) => {
  // 异步操作
  setTimeout(() => {
    if (Math.random() < 0.5) {
      resolve('success');
    } else {
      reject('error');
    }
  }, 1000);
});
 
promise.then(result => {
  console.log(result);
  console.log('第一次then执行成功');
}).then(()=>{
    console.log('第二次then执行成功,Promise.then()后的结果仍然是一个Promise,可以进行链式调用');
}).catch(error => {
  console.log(error);
  console.log('第一次then执行失败,直接跳到catch');
}).finally(()=>{
    console.log('无论执行成功与否,finally都会执行');
});

两种返回结果

 

6.实现一个简单Promise

const  PENDING ='pending'
const  RESOLVED='resolved'
const  REJECTED='rejected'
function myPromise(fn){
    const that=this;
    this.state=PENDING;
    //value用来保存resolve或reject中传入的值
    this.value=null
    //用来保存then中的回调.因为执行完Promise,状态有可能还是等待中
    that.resolvedCallback=[]
    that.rejectedCallback=[]

    function resolve(value){
        //两个函数开始要先判断当前状态是否为等待中
        if(that.state===PENDING){
            that.state=RESOLVED
            that.value=value
            //遍历数组回调并执行
            that.resolvedCallback.map(cb=>cb(that.value))
        }
    }
    function reject(value){
        //两个函数开始要先判断当前状态是否为等待中
        if(that.state===PENDING){
            that.state=REJECTED
            that.value=value
            //遍历数组回调并执行
            that.resolvedCallback.map(cb=>cb(that.value))
        }
    }
    try{
        fn(resolve,reject)
    }catch(e){
        reject(e)
    }
}
//实现then函数
myPromise.prototype.then=function(onFulfilled,OnRejected){
    const that=this
    //判断两个参数是否为函数类型,因为两个参数是可选参数
    onFulfilled=typeof onFulfilled==='function'?onFulfilled:v=>v
    OnRejected=typeof OnRejected==='function'?OnRejected:e=>{throw e}
    //
    if(this.state===PENDING){
            this.resolvedCallback.push(onFulfilled)
            this.rejectedCallback.push(onFulfilled)
    }
    if(this.state===RESOLVED){
        onFulfilled(that.value)
    }
    if(this.state===REJECTED){
        OnRejected(that.value)
    }
}

//应用
const promise = new myPromise((resolve, reject) => {
  // 异步操作
  setTimeout(() => {
    if (Math.random() < 0.5) {
      resolve('success');
    } else {
      reject('error');
    }
  }, 1000);
});
 
promise.then(result => {
  console.log(result);
  console.log('then执行成功');
});

文章灵感:阮一峰的Promise                10分钟彻底掌握手写promise及原理,难倒面试官!_哔哩哔哩_bilibili

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

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

相关文章

Magic Bullet Suite2024.0.1(ae降噪插件合集)

Red Giant Magic Bullet Suite是一套专业的视频后期处理软件&#xff0c;适用于Adobe Premiere Pro、After Effects等视频编辑软件。它提供了多种精美的视频特效和调色工具&#xff0c;使得视频制作更加专业和出色。 Magic Bullet Suite包括多个插件&#xff0c;其中最为知名的…

安防视频监控平台EasyCVR集成到ios系统不能播放是什么原因?如何解决?

视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#…

什么是多云? 为什么我们需要多云可观测性 (Observability)?

Observe 是一家提供可观察性云解决方案的公司&#xff0c;以帮助企业加速应用故障排查和问题解决的效率。公司成立于2017年9月&#xff0c;总部位于美国加利福尼亚州圣马特奥。到目前为止&#xff0c;Observe 已经在5轮融资中总共筹集了1.62亿美元。他们最近的一轮融资是在2023…

【EI会议征稿】第二届可再生能源与电气科技国际学术会议(ICREET 2023)

第二届可再生能源与电气科技国际学术会议(ICREET 2023) 2023 2nd International Conference on Renewable Energy and Electrical Technology 2020年中国可再生能源发电规模显著扩大&#xff0c;风力和太阳能发电均呈迅速增长趋势。中国大力推进能源低碳化&#xff0c;减少温…

醒醒吧,这才叫自动化测试最全教程,看完可就业!

最近看到很多粉丝在后台私信我&#xff0c;叫我做一期自动化测试的教程&#xff0c;其实关于这个问题&#xff0c;我也早就在着手准备了&#xff0c;我录制了一整套完整的Python自动化测试的教程&#xff0c;都上传在网盘里&#xff0c;大家有兴趣的可以去看一下&#xff01; 一…

Linux系统下centos中在线添加硬盘后不重启在线扩容linux系统目录不重启系统

Centos7 在线添加硬盘不重启系统 CentOS 7在线添加新磁盘,无需重启 现有环境基本都是线下server以及线上虚拟机等,几乎都支持热插拔,热扩容,所以在线添加新磁盘就尤为重要,这样可以无需中断当前服务或进程也可对其进行添加硬盘操作。 1.添加硬盘: 虚拟机在线状态下对其进行添加…

Ansys Zemax | 如何建立LCD背光源模型

本文建立了楔形LCD背光源模型&#xff0c;并对其进行分析&#xff0c;并按照照明输出标准对其进行优化。 附件下载 联系工作人员获取附件 简介 液晶显示器 (LCDs) 作为一种显示技术&#xff0c;在当今社会中已经得到了广泛的应用。在商业领域中最突出的应用包括计算机显示器…

Blender:使用立方体制作动漫头像

好久没水文章 排名都掉到1w外了 ~_~ 学习一下blender&#xff0c;看能不能学习一点曲面变形的思路 一些快捷键 ctrl 空格&#xff1a;区域最大化&#xff0c;就是全屏 ctrl alt 空格&#xff1a;也是区域最大化 shift b&#xff1a;框选区域然后最大化显示该范围 shift 空…

著名色彩专家预测下一个家居空间的色彩趋势竟然是这个

室内造型师和色彩专家索菲-罗宾逊&#xff08;Sophie Robinson&#xff09;分享了她对今年下半年色彩和涂料流行趋势的预测。她认为色彩文艺复兴就在我们身边。 在此之前&#xff0c;索菲分享了她摆脱 "50 色调米色 "的秘诀&#xff0c;学会在充满中性客厅配色方案和…

Linux下platform驱动框架描述

文章目录 驱动的分离与分层platform模型简介 如果要写复杂的外设驱动&#xff0c;Linux系统就要考虑到驱动的可重用性&#xff0c;因此提出了驱动的分离与分层这样的软件思路&#xff0c;platform设备驱动就是在这种思路下诞生的&#xff0c;其也称为平台设备驱动。 对于Linux这…

一次Go项目进程重启故障问题排查

有个go项目的容器近两天几乎每天都异常重启一次&#xff0c;且两个节点基本都是差不多的时间异常重启。看了监控指标&#xff0c;发现CPU平稳&#xff0c;而内存是缓慢涨上去后&#xff0c;进程被操作系统kill掉&#xff0c;导致pod重启。 从内存指标可以看出&#xff0c;不会…

大量需求测不过来怎么破?

互联网测试少&#xff0c;测试研发比大概在1:5&#xff0c;再加上产品再使足了劲上需求&#xff0c;导致了测试需求量大&#xff0c;测试准备时间短&#xff0c;从而降低了上线质量。那么如何解决呢&#xff1f;测试是质量负责人&#xff0c;要对平台质量负责&#xff0c;于是就…

解决方案 | 法大大电子签精准击破销售场景签约难题

新商业形态及新交易模式不断涌现&#xff0c;电子签已经成为现代商业活动中不可或缺的一部分。特别是在销售场景中&#xff0c;电子签的应用不仅可以提高销售效率&#xff0c;还可以降低成本&#xff0c;提高客户满意度。本文将详细分析电子签在销售场景中的应用价值能力&#…

{2023版}老牌配资平台排行报告:十大排名和实盘评估详情

随着投资者对股市的深入了解&#xff0c;越来越多的人开始选择配资交易。在配资平台的选择上&#xff0c;除了要注意平台的合法性和安全性外&#xff0c;平台的口碑和服务质量也是非常重要的考虑因素。为了方便投资者的选择&#xff0c;尚红网、倍悦网、兴盛网、诚利和、嘉正网…

Jetson Orin NX 开发指南(4): 安装 CUDA 和 Realsense

一、硬件说明 可以在官网查看各个类型的相机说明 Intel RealSense™ Computer Vision - Depth and Tracking cameras 目前实验室常用的是 D400 系列的相机&#xff0c;如 D435i相机&#xff0c;D455相机等&#xff0c;本文主要使用 D435i 相机 D435i 相机是一个RGB-D相机&am…

iOS 面试题以及自我理解答案

1、简述push原理&#xff0c;push的证书和其他的有什么不一样&#xff1f; 第 一阶段&#xff1a;BeejiveIM服务器把要发送的消息、目的iPhone的标识打包&#xff0c;发给APNS。 第二阶段&#xff1a;APNS在自身的已注册Push服务 的iPhone列表中&#xff0c;查找有相应标识的iP…

pdf怎么压缩的小一点?分享pdf文件压缩方法

在数字化时代&#xff0c;PDF文件已成为我们日常工作和学习中不可或缺的一部分&#xff0c;然而&#xff0c;有时我们需要发送或存储的PDF文件过大&#xff0c;给我们的交流和存储带来不便。那么&#xff0c;如何将PDF文件压缩得小一点&#xff0c;以便更方便地传输和存储呢&am…

Android Studio for Platform (ASfP) 使用教程

文章目录 编写脚本下载源代码lunch 查看版本 归纳的很清楚&#xff0c;下载Repo并下载源码->可以参考我的 Framework入门のPiex 6P源码(下载/编译/刷机) 启动图标&#xff08;重启生效&#xff09; [Desktop Entry] EncodingUTF-8 NameAndroidStudio …

NCV6324CMTAATBG---车规级3MHz 2A 高效同步降压转换器

同步降压转换器&#xff1f; 是一种电源管理电路&#xff0c;它可以将输入电压转换为较低的输出电压。与传统的降压转换器相比&#xff0c;同步降压转换器具有更高的效率和更好的动态响应。 同步降压转换器的工作原理是通过控制开关管的导通和截止来实现电能的转换。在导通状…

Java架构师数据库设计

目录 1 导学2 数据库设计3 数据库设计的基本步骤3.1 优秀的数据库设计的基本原则3.1 数据库冗余设计4 数据库表逻辑关系设计4.1 MySQL设计表结构工具4.2 数据库建模工具5 数据库表结构设计5.1 MySQL调优5.2 SQL语句优化6 总结1 导学 数据库设计作为架构师的核心设计能力之一,对…