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

JS进阶-手写Promise

一、什么是Promise

在Promise A+规范中规定,Promise是一个有一个符合规范的then方法的对象或者函数。

1.关于then

  • then接收onFulfilled和onRejected两个可选参数;
  • then必须返回一个新的Promise对象;
  • 如果onFulfilled是一个函数
    • 在状态切换为fulfilled之后调用;
    • 不能被多次调用。
  • 如果onRejected是一个函数
    • 在状态切换为rejected是被调用;
    • 不能被多次调用。

2.状态

  • pending: 初始状态,会转换为下面的俩个状态;
  • fulfilled: 成功状态,不会再转为其他状态;
  • rejected: 失败状态,不会再转为其他状态。

3.关于ES6中的Promise

  • 构造函数接受一个回调函数executor;
  • executor接受两个参数resolve、reject;
  • executor在new Promise是被同步调用;
  • 任务被解决时,调用resolve,并传入结果;
  • 任务被拒绝时,调用reject,并传入拒绝原因;
  • Promise对象除了then还有catch和finally两个函数;
  • Promise有all、resolve等静态函数。

二、实现

1.状态定义

const PENDING = 'pending';
const FULFILLED = 'fulfilled';
const REJECTED = 'rejected';

2.功能实现

class MyPromise {// 当前状态#state = PENDING;// 解决或拒绝的结果#result = undefined;// 通关连环then注册的回调#handlers = [];// 构造函数constructor(executor) {// 定义两个状态切换函数const resolve = (data) => {this.#setState(FULFILLED, data);};const reject = (reason) => {this.#setState(REJECTED, reason);};// 同步调用参数函数try {executor(resolve, reject);} catch (error) {reject(error);}}// 状态切换#setState(state, result) {if (this.#state !== PENDING) return;this.#state = state;this.#result = result;this.#run();}// 执行then注册的所有任务#run() {if (this.#state === PENDING) return;// 遍历所有注册的回调while(this.#handlers.length > 0){const handler = this.#handlers.shift();const {resolve, reject, onFulfilled, onRejected} = handler;// 根据结果执行每个任务if (this.#state === FULFILLED) {this.#runOne(onFulfilled, resolve, reject);} else if (this.#state === REJECTED) {this.#runOne(onRejected, resolve, reject);}}}// 执行一个任务#runOne() {// 将任务放入微队列,等待被执行this.#runMicroTask(() => {if (typeof callback !== 'function') {// 不是函数的话,透传一下当前结果if (this.#state === FULFILLED) {resolve(this.#result);} else {reject(this.#result);}return;}try {const data = callback(this.#result);if (this.#isPromiseLike(data)) {// 结果是Priomise的话data.then(resolve, reject);} else {// 不是Promise的话直接完成,并传递结果resolve(data);}} catch (error) {reject(error);}});}// 按Promise A+规范判断参数是否是一个Promise#isPromiseLike(value) {if (value !== null && (typeof value === 'object' || typeof value === 'function')) {return typeof value.then === 'function';}return false;}// 将任务放入微队列#runMicroTask(func) {if (typeof process === 'object' && typeof process.nextTick === 'function') {// 在nodejs中process.nextTick(func);} else if (typeof MutationObserver === 'function') {// 在浏览器中const textNode = document.createTextNode('1');const ob = new MutationObserver(func);// 让ob观察textNode的字符串变化,观察到之后会将构造函数// 中传入的func加入微队列执行ob.observe(textNode, {characterData: true,});textNode.data = '2';} else {// 没有上述环境,只能用宏队列代替了setTimeout(func, 0);}}then(onFulfilled, onRejected) {// 返回新Promisereturn new MyPromise((resolve, reject) => {// 将任务存起来this.#handlers.push({resolve,reject,onFulfilled,onRejected,});this.#run();});}
}

相关文章:

JS进阶-手写Promise

一、什么是Promise 在Promise A规范中规定,Promise是一个有一个符合规范的then方法的对象或者函数。 1.关于then then接收onFulfilled和onRejected两个可选参数;then必须返回一个新的Promise对象;如果onFulfilled是一个函数 在状态切换为f…...

PCL点云库入门——PCL库点云滤波算法之直通滤波(PassThrough)和条件滤波(ConditionalRemoval)

0、滤波算法概述 PCL点云库中的滤波算法是处理点云数据不可或缺的一部分,它们能够有效地去除噪声、提取特征或进行数据降维。例如,使用体素网格滤波(VoxelGrid)可以减少点云数据量,同时保留重要的形状特征。此外&#…...

ioctl回顾

一、ioctl协议的命令组成 cmd本质为一个32位的数字,共分为四段: [31-30]:读写方向dir,分为无数据(_IO)、读数据(_IOR)、写数据(_IOW)、读写数据(_IOWR)四种模式; [29-16]:传递数据的大小size,一般利用其宏_IO、_IOR…...

jquery-validate在前端数据校验中的应用以及remote异步调用实践-以若依为例

目录 前言 一、关于Jquery Validate组件 1、validate是什么 2、内置验证方式及触发方式 3、自定义验证规则 二、基本验证实战以及Remote验证 1、基本验证实现 2、remote校验方式 三、总结 前言 随着技术的不断演进,在我们的日常开发过程中,大家一…...

如何重新设置VSCode的密钥环密码?

故障现象: 忘记了Vscode的这个密码: Enter password to unlock An application wants access to the keyring “Default ke... Password: The unlock password was incorrect Cancel Unlock 解决办法: 1.任意terminal下,输入如下…...

Android--java实现手机亮度控制

文章目录 1、开发需求2、运行环境3、主要文件4、布局文件信息5、手机界面控制代码6、debug 1、开发需求 需求:开发一个Android apk实现手机亮度控制 2、运行环境 Android studio最新版本 3、主要文件 app\src\main\AndroidManifest.xml app\src\main\res\layou…...

原点安全再次入选信通院 2024 大数据“星河”案例

近日,中国信息通信研究院和中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)共同组织开展的 2024 大数据“星河(Galaxy)”案例征集活动结果正式公布。由工银瑞信基金管理有限公司、北京原点数安科技有限公司联…...

torch.nn.init 模块介绍

PyTorch 的 torch.nn.init 模块提供了一组用于初始化张量或模型参数的函数。这些初始化方法对深度学习模型的训练收敛速度和性能有显著影响,正确选择初始化方法可以避免梯度消失或爆炸等问题。 模块功能 torch.nn.init 提供了一系列函数,用于对张量(如权重或偏置)进行初始…...

人工智能与物联网:从智慧家居到智能城市的未来蓝图

引言:未来已来,智能化的世界 想象一下,一个早晨,智能闹钟根据你的睡眠状态自动调整叫醒时间,咖啡机早已备好热腾腾的咖啡,窗帘缓缓拉开,迎接清晨的阳光。这不是科幻小说中的场景,而是…...

极狐GitLab 17.7正式发布,可从 GitLab 丝滑迁移至极狐GitLab【一】

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...

纯Dart Flutter库适配HarmonyOS

纯Dart Flutter库适配HarmonyOS介绍: Flutter基本组件、Flutter布局组件、Flutter图片组件、Flutter字体、Flutter图标、Fluter路由、flutter动画、 Flutter表单、flutter异步等,纯Dart库无需任何处理,可以直接编译成HarmonyOs应用。 具体步…...

【R语言遥感技术】“R+遥感”的水环境综合评价方法

R语言在遥感领域中是一个强大的工具,它提供了一系列的功能和优势,使得遥感数据的分析和应用更加高效和灵活。以下是R语言在遥感中的具体应用: 数据处理:R语言可以处理和清洗遥感数据,包括数据转换、滤波处理、去噪和数…...

软件工程三 需求获取与结构化分析方法(需求分析、功能建模、数据建模、行为建模、数据字典等)

包括内容如下: 1. 需求获取与需求分析阶段的任务 2. 结构化分析方法 3. 系统需求规格说明 4. 需求评审 5. 需求管理 3.1 需求获取与需求分析阶段的任务 3.1包括: 需求获取的任务和原则 需求获取的过程 软件需求分析阶段的任务 3.1.1需求获取的任…...

Python 抽象基类 ABC :从实践到优雅

今天我们来聊聊 Python 中的抽象基类(Abstract Base Class,简称 ABC)。虽然这个概念在 Python 中已经存在很久了,但在日常开发中,很多人可能用得并不多,或者用得不够优雅。 让我们从一个实际场景开始&…...

Elasticsearch检索方案之一:使用from+size实现分页

前面两篇文章介绍了elasticsearch以及Kibana的安装,检索引擎以及可视化工具都已经安装完成,接下来介绍下如何使用golang的sdk实现简单的分页查询。 1、下载Elastic官方golang sdk 在讲解elasticsearch检索之前,需要先把golang的环境安装好&…...

知识图谱+大模型:打造全新智慧城市底层架构

在数字化时代,智慧城市的建设正迎来新一轮的变革。本文将探讨如何结合知识图谱和大模型技术,构建智慧城市的全新底层架构,以应对日益增长的数据量和复杂性,提升城市管理的智能化水平。 知识图谱:智慧城市的知识库 知识…...

Flutter开发HarmonyOS 鸿蒙App的好处、能力以及把Flutter项目打包成鸿蒙应用

Flutter开发HarmonyOS的好处: Flutter是谷歌公司开发的一款开源、免费的UI框架,可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前 Flutter 已经支持 iOS、Android、Web、Windows、macOS、Linux 的跨平台开发…...

vscode安装fortran插件配置

本章教程,主要介绍如何在vscode上安装fortran插件,以便于使用vscode运行fortran编写的程序。 一、安装插件 首先在插件商店安装这个扩展插件 然后再把Code Runner扩展插件装上 二、下载mingw64 通过网盘分享的文件:mingw64 链接: https://pan.baidu.com/s/1fwS-CwC7dgI...

容器化平台Docker初识

Docker 是一个容器化平台,可以让你打包、分发和运行应用程序。它的核心思想是通过容器技术,让应用程序在任何环境下都能以一致的方式运行。 通俗易懂的理解 快餐盒的比喻: 假设你做了一顿饭(开发了一个应用程序)&#…...

【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】

目录😋 任务描述 相关知识 1、输入数值 2、选择结构语句 3、计算结果并输出 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务:编写一个程序,该程序需输入个人数据,进而预测其成年后的身高。 相关知识 为了完成本…...

微信小程序连接大模型:百川2-13B赋能智能客服小程序开发

微信小程序连接大模型:百川2-13B赋能智能客服小程序开发 最近在做一个宠物用品商城的小程序,老板提了个需求,想给用户加个24小时在线的智能客服,能回答一些关于宠物喂养、商品咨询的常见问题。一开始想用传统的规则问答&#xff…...

开源PDF工具clawPDF:高效办公的终极解决方案

开源PDF工具clawPDF:高效办公的终极解决方案 【免费下载链接】clawPDF Open Source Virtual (Network) Printer for Windows that allows you to create PDFs, OCR text, and print images, with advanced features usually available only in enterprise solutions…...

2026届必备的六大AI科研神器解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 步入人工智能生成内容越来越普遍的大环境里,把文本的机器感给降低变成了提高可读…...

Realistic Vision V5.1虚拟摄影棚教程:自定义ControlNet姿势控制技巧

Realistic Vision V5.1虚拟摄影棚教程:自定义ControlNet姿势控制技巧 1. 项目概述 Realistic Vision V5.1虚拟摄影棚是基于当前最先进的写实风格生成模型开发的本地化工具,能够帮助用户轻松创建专业级摄影作品。这个工具特别适合需要高质量人像生成但又…...

3个简单步骤:让Windows 11完美运行经典老游戏的终极DDrawCompat方案

3个简单步骤:让Windows 11完美运行经典老游戏的终极DDrawCompat方案 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirr…...

GHelper:华硕笔记本性能优化与硬件控制的轻量级开源解决方案

GHelper:华硕笔记本性能优化与硬件控制的轻量级开源解决方案 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Str…...

leetcode 1624. 两个相同字符之间的最长子字符串-耗时100

Problem: 1624. 两个相同字符之间的最长子字符串 耗时100%&#xff0c;双指针&#xff0c;找到相同的以后直接break以及拿到最大值 Code class Solution { public:int maxLengthBetweenEqualCharacters(string s) {int n s.size(), mx -1;char ch;for(int i 0; i < n; i…...

外卖系统订单模块设计避坑指南:地址簿管理与状态流转实战

外卖系统订单模块设计避坑指南&#xff1a;地址簿管理与状态流转实战 中午12点&#xff0c;写字楼里的白领们纷纷打开外卖APP下单午餐。短短几分钟内&#xff0c;系统需要处理成千上万笔订单——验证用户地址、确认支付状态、通知商家接单。这背后是一套复杂的订单系统在支撑&a…...

Outlook打开附件打不开转圈卡死没反应?教你1分钟搞定

我们有时使用邮件收发程序outlook中打开来自对方的邮件附件时,附件格式为excel电子表格文档,一般这种表格文档经常容易出现此种问题,打开时excel程序卡住半天没有反应,且还会导致outlook本身也因此操作起来变得很卡顿,但是在Outlook中打开PDF和其它格式的文档不会出现此种…...

口碑好的动态压剪试验机哪个更优

在众多工业和科研领域&#xff0c;动态压剪试验机是一种至关重要的设备&#xff0c;它能够模拟各种复杂的力学环境&#xff0c;对材料和构件的性能进行精确测试。然而&#xff0c;面对市场上众多的品牌和型号&#xff0c;如何选择一款口碑好且性能优越的动态压剪试验机成为了许…...