唯心主义蠢货的[js知识总结] 手写一个promise

2023-10-14 01:10

本文主要是介绍唯心主义蠢货的[js知识总结] 手写一个promise,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

promise

用法分析

在这里插入图片描述

流程分析
  • promise通过一个接收一个函数进行实例化
  • 此函数接收两个参数,一个为fulfill时进行的处理,一个为reject时进行的处理
  • 当exector函数在promise内部进行执行时,修改promise的value和status
  • 在then和catch中,根据status进行条件判断
关于优化的点
  • exector为异步调用时
  • 如何实现then的链式调用

代码基本实现

  • promise接收一个exector,并在内部进行value和status的改变 在这里插入图片描述

  • then进行resolve的实现
    在这里插入图片描述

  • catch进行reject的实现
    在这里插入图片描述

代码优化

关于异步

当出现异步操作时,即promise先对exector内部逻辑进行事件注册,然后对then和catch进行执行,当exector内部需要执行时再进行执行,也即需要先对then和catch对应的事件进行保留,再根据exector的改变进行调用

  • 在promise内声明两个操作数组
    在这里插入图片描述

  • 在then中加入pending状态下,将操作事件压入的分支

  • 在promise中当status改变时,对操作数组内的事件进行执行

关于链式操作
  • 链式操作的关键在于在操作时,返回一个promise

  • promise的exector函数,为对当前then传入的fulfulled和rejected函数的处理
    1570421403141.png"

  • promise的value和status值,为上一步即fulfulled和rejected的返回值

    • 如果返回值为非promise类型,则通过resolve状态改变函数,将此返回值作为参数传入

    • 如果返回值为promise类型,则通过x.then(resolve,reject) 对其内部的值进行改变(由于resolve和reject的this都对应着返回值promise,x内部的操作即对返回promise的value和status的改变)

    • 如果出现错误,则也将其作为下一个promise的成功resolve的参数进行传递

代码

function promise( exector ) {let _this = this;this.value = null; // 处理值this.status = 'pending'; //当前状态this.reason = null; // 失败原因this.onFulfilledCallback = []; // resolve处理数组this.onRejectCallback = []; // reject处理数组//当且仅当 status为pending时 状态才可以改变  即一旦成功或失败 则不允许改变状态//resolve函数  改变value  改变状态function resolve( value ) {if (_this.status == 'pending') {_this.value = value;_this.status = 'resolve';_this.onFulfilledCallback.forEach(fn => {fn(_this.value); // 根据函数注册的顺序执行});}}// reject函数  改变reason  改变状态function reject( reason ) {if (_this.status == 'pending') {_this.reason = reason;_this.status = 'reject';_this.onRejectCallback.forEach(fn => {fn(_this.reason);});}}try {exector(resolve, reject);  //执行  进行状态的改变} catch ( e ) {reject(e);  // 直接跳到reject状态}}promise.prototype.then = function ( onFulfilled, onRejected ) {let _this = this;onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : function ( value ) { };  // 判断是否为函数onRejected = typeof onRejected === 'function' ? onRejected : function ( reason ) {  };if (_this.status == 'resolve') {return new promise(( resolve, reject ) => {try {let x = onFulfilled(_this.value);//处理这一步的操作if( x instanceof promise){  //但当前返回值为promise时x.then(resolve,reject);//因为resolve和reject都指向外部this,所以在x中改变value和status即对外部进行改变}else{resolve(x);  // 改变返回promise的value和status}}catch ( e ) {reject(e);}});}if (_this.status == 'reject') {return new promise(( resolve, reject ) => {try {let x =onRejected(_this.value);if(x instanceof promise){x.then(resolve,reject);  }else{resolve(x);}}catch ( e ) {reject(e);}});}if (_this.status == 'pending') {return new promise(( resolve, reject ) => {_this.onFulfilledCallback.push(() =>{let x = onFulfilled(_this.value);if( x instanceof  promise){x.then(resolve,reject);}else{resolve(x);}});_this.onRejectCallback.push( () =>{let x = onRejected(_this.reason);if(x instanceof promise){x.then(resolve,reject);}else{resolve(x);}});});}};promise.prototype.catch = function ( error ) {return this.then(null, error);};function test( resolve, reject ) {let i = Math.random() * 10;setTimeout(function () {if (i > 5) {resolve(i);} else {reject(i);};}, 500);console.log('123456');}function test2( x ) {let i = Math.random() * 100;return new promise(function ( resolve,reject ) {console.log("略略略"+x);resolve(x+1);});}let p = new promise(test);// p.then(function ( value ) {//     console.log('resolve' + value);//     return " resolve"+value;// },function ( error ) {//     console.log('error' + error);//     return " error"+error;// }).then(function ( value ) {//     console.log('resolve' + value);// }).catch(function ( error ) {//     console.log('error' + error);// });p.then(test2).then(test2);

这篇关于唯心主义蠢货的[js知识总结] 手写一个promise的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/207093

相关文章

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

VSCode中配置node.js的实现示例

《VSCode中配置node.js的实现示例》本文主要介绍了VSCode中配置node.js的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一.node.js下载安装教程二.配置npm三.配置环境变量四.VSCode配置五.心得一.no

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)