当前位置: 首页 > news >正文

前端面经 手写Promise

在这里插入图片描述

核心功能

仿Promise对象需要接收包含两个变量的回调函数

构造函数

   <script>class myPromise {constructor(func){const resolve = (result)=>{console.log(`resolve执行了`)}const reject =  (result)=>{console.log(`reject执行了`)}func(resolve,reject)}}//  Promise的构造函数传入一个resolve值调用构造函数外部定义好的resolve 和 reject方法const pro = new myPromise((resolve,reject)=>{console.log(`Promise内的同步部分被实现了`)resolve(`succeed`)})</script>

状态及其原因

为Promise类对象添加实例状态state和原因result,并且改变状态也不可逆仅限pending状态可变

  class myPromise {// 添加实例属性 statestate = pending// 添加原因属性 resultresult = undefinedconstructor(func){const resolve = (result)=>{// 改状态statethis.state = fullfilled// 原因传参 this.result =result}const reject =  (result)=>{// 改状态statethis.state = reject// 原因传参 this.result =result}func(resolve,reject)}}

为Promise类添加实例属性state和result 为实现隔离状态改变

加上条件判断当state是pending时再进行改动
<script>// 状态常量 定义const pending = `pending`const fullfilled = `fullfilled`const reject = `reject`class myPromise {// 添加实例属性 statestate = pending// 添加原因属性 resultresult = undefinedconstructor(func){const resolve = (result)=>{if(this.state===pending){// 改状态statethis.state = fullfilled// 原因传参 this.result =result}}const reject =  (result)=>{if(this.state===pending){// 改状态statethis.state = reject// 原因传参 this.result =result}}func(resolve,reject)}}//  Promise的构造函数传入一个resolve值调用构造函数外部定义好的resolve 和 reject方法const pro = new myPromise((resolve,reject)=>{console.log(`Promise内的同步部分被实现了`)resolve(`404 没找到`)})</script>
实现步骤 :1为myPromise添加实例状态state和实例结果result 2.修改result()

then方法

设想这样的then()和catch() 方法大概要挂载在myPromise类的prototype原型对象上

参数判断 then()中传递的参数是否为两个回调函数
    class myPromise {// 添加实例属性 statestate = pending// 添加原因属性 resultresult = undefinedconstructor(func){const resolve = (result)=>{if(this.state===pending){// 改状态statethis.state = fullfilled// 原因传参 this.result =resultconsole.log(`成功`)}}const reject =  (result)=>{if(this.state===pending){// 改状态statethis.state = reject// 原因传参 this.result =result}}func(resolve,reject)}// 添加实例方法 then接收两个回调函数作为参数then(onFullfilled,onRejected){//  实参为空的情况onFullfilled = onFullfilled === `function`?onFullfilled:(x)=>{return x}onRejected = onRejected === `function`?onRejected:(x)=>{throw x}}}
class myPromise {// 添加实例属性 statestate = pending// 添加原因属性 resultresult = undefinedconstructor(func){const resolve = (result)=>{if(this.state===pending){// 改状态statethis.state = fullfilled// 原因传参 this.result =resultconsole.log(`状态变更为成功`)}}const reject =  (result)=>{if(this.state===pending){// 改状态statethis.state = Reject// 原因传参 this.result =resultconsole.log(`状态变更为失败`)}}func(resolve,reject)}// 添加实例方法 then接收两个回调函数作为参数then(onFullfilled,onRejected){//  实参为空的情况onFullfilled = typeof onFullfilled === `function`?onFullfilled:(x)=>{return x}onRejected = typeof onRejected === `function`?onRejected:(x)=>{throw x}// 根据状态执行函数if(this.state===fullfilled){onFullfilled(this.result)}else if(this.state===Reject){onRejected(this.result)}}}

异步任务

链式编程

相关文章:

  • Linux 内核中 inet_accept 的实现与自定义传输协议优化
  • 部署docker上的redis,idea一直显示Failed to connect to any host resolved for DNS name
  • Tcping详细使用教程
  • .NET Core liunx二进制文件安装
  • 能源数字化转型关键引擎:Profinet转Modbus TCP网关驱动设备协同升级
  • 《k-means 散点图可视化》实验报告
  • 简单入门RabbitMQ
  • OrangePi Zero 3学习笔记(Android篇)11 - IR遥控器
  • python自学笔记2 数据类型
  • 汉诺塔超算堆栈结构编码和流程详细设计(附源代码)
  • [SpringBoot]Spring MVC(2.0)
  • Android native崩溃问题分析
  • Python基础:集合(Set)
  • 今日积累:若依框架配置QQ邮箱,来发邮件,注册账号使用
  • MySQL高可用
  • Kubernetes 1.28 无 Docker 运行时环境下的容器化构建实践:Kaniko + Jenkins 全链路详解
  • Web服务器怎么压测?可用什么软件?
  • 嵌入式故障码管理系统设计实现
  • Unity3D Overdraw性能优化详解
  • CMS(plone / joomla 搭建测试)
  • 首次公布!我国空间站内发现微生物新物种
  • 广西壮族自治区党委常委会:坚决拥护党中央对蓝天立进行审查调查的决定
  • 刘小涛任江苏省委副书记
  • 新修订的《餐饮业促进和经营管理办法》公布,商务部解读
  • 巴菲特最新调仓:一季度大幅抛售银行股,再现保密仓位
  • A股三大股指低收:汽车股领涨,大金融走弱,两市成交近1.1万亿元