当前位置: 首页 > 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)}}}

异步任务

链式编程

http://www.xdnf.cn/news/480745.html

相关文章:

  • GTS-400 系列运动控制器板卡介绍(三十五)---读取运动控制器版本号
  • 大语言模型 09 - 从0开始训练GPT 0.25B参数量 补充知识之数据集 Pretrain SFT RLHF
  • 车道线检测----CLRKDNet
  • 【CanMV K230】AI_CUBE1.4
  • mac中加载C++动态库文件
  • RK3568-鸿蒙5.1镜像烧录与调试
  • 不同坐标系下MATLAB绘制阵列的方向图
  • Gen5 应用实例
  • Qwen3技术报告解读:训练秘籍公开,推理与非推理模型统一,大模型蒸馏小模型(报告详细解读)
  • H3C网络设备(交换机、路由器、防火墙)常用命令整理
  • 德劳内三角剖分原理
  • VSCode + Cline AI辅助编程完全指南
  • ubuntu环境下 基于Python 打包的 批量命令行可视化操作工具 GUI
  • 数字经济新范式:探秘国际数字影像产业园的园区服务
  • Gensim 是一个专为 Python 设计的开源库
  • 如何在 Windows 10 或 11 上使用命令提示符安装 PHP
  • 多模态大语言模型arxiv论文略读(七十八)
  • 【python基础知识】Day 27 函数专题2:装饰器
  • SAP ABAP 程序中归档数据读取方式
  • React Flow 节点类型详解与实战:内置节点使用与自定义组件开发
  • 排序算法之线性时间排序:计数排序,基数排序,桶排序详解
  • 怎么用idea分析hprof文件定位JVM内存问题
  • 米勒电容补偿的理解
  • JMeter 教程:编写 GET 请求脚本访问百度首页
  • 学习笔记(C++篇)--- Day 5
  • 激活函数全解析:定义、分类与 17 种常用函数详解
  • 奥运数据可视化:探索数据讲述奥运故事
  • VulnHub | Breach - 1
  • 顶层设计-IM系统架构
  • Leetcode刷题 | Day64_图论09_dijkstra算法