唯心主义蠢货的[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

相关文章

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

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