promise的三种状态_一.Promise中核心逻辑的实现

f0b082bfa3d70009bffc91ab839e9211.png

首先看一下Promise代码:

let promise =new Promise((resolve,reject)=>{resolve('成功');//reject('失败');
})
promise.then(val=>{console.log(val);
},reason=>{console.log(reason);
})

我们根据以上的一个简单的用例,得到Promise类的最主要的核心逻辑,分为以下几个方面:

  1. Promise 是一个类,在执行这个类的时候,需要传递一个执行器,声明实例的时候,执行器会立刻执。
  2. Promise 中有三种状态 pending等待(默认) fulfilled成功 rejected失败 三种状态关系: fulfilled <= pending => rejected 一旦状态改变就不可更改。
  3. resolve与reject函数是用来更改状态的。 resolve:fulfilled reject:rejeceted
  4. then方法内部做的事情就是判断状态,如果状态是成功,调用成功的回调函数,如果状态失败,调用失败的回调函数。
  5. then成功回调一个参数,表示成功之后的值 ;then失败回调一个参数,表示失败后的原因。

根据以上得到的部分结论,我们可以实现以下代码:

//常量定义三种状态 以防拼错与进行代码提示。
const PENDING='pending';
const FULFILLED='fulfilled';
const REJECTED='rejected';class MyPromise{//执行器constructor(executor){//当前函数this指定MyPromise对象this.resolve=this.resolve.bind(this);this.reject=this.reject.bind(this);//默认状态this.status=PENDING;//成功返回数据this.value=undefined;//失败返回原因this.reason=undefined;//执行执行器executor(this.resolve,this.reject);}//成功执行时的方法resolve(value){//因为状只能是pending=> fulfilled/rejected 如果其他状态就返回if(this.status!==PENDING) return;//执行之后状态更改为fulfilledthis.status=FULFILLED;//把成功返回值保存在变量里边this.value=value;}//失败执行方法reject(reason){if(this.status!==PENDING) return;this.status=REJECTED;//把失败返回值保存在变量里边this.reason=reason;}//then方法执行then(sucessCallback,failCallback){//判断状态 来调用回调函数switch(this.status){case FULFILLED:sucessCallback(this.value);break;case REJECTED:failCallback(this.reason);break;default:break;}}
}

我们可以调用MyPromise类来实现文章开头代码所展示的功能。

let promise=new MyPromise((resolve,reject)=>{//resolve('成功');reject('失败');
});
promise.then(val=>{console.log(val);
},reason=>{console.log(reason);
})

fb9f2f2e8379dca3fd57d6a1452f68e2.png

目前我们只实现了一个简单的同步调用逻辑,如果代码中有异步操作,需要怎么实现呢?

let promise=new MyPromise((resolve,reject)=>{setTimeout(() => {resolve('成功');}, 1000);//reject('失败');
});
promise.then(val=>{console.log(val);
},reason=>{console.log(reason);
})

请看下篇文章

李先生:二.Promise中异步逻辑的实现​zhuanlan.zhihu.com
2d6ef914663a8e02a20185c87e070052.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql如何定位到数据_如何快速定位当前数据库消耗CPU最高的sql语句?

概述如果是Oracle数据库我们可以很容易通过sql来定位到当前数据库中哪些消耗CPU高的语句&#xff0c;而mysql数据库可以怎么定位呢&#xff1f;这里用一个简单例子说明下...主要是了解如何定位的思路&#xff0c;具体看官网介绍..参考&#xff1a;https://www.percona.com/blog…

当当elastic-job docker快速部署_[小Z课堂]-docker 快速部署 elasticsearch 和 kibana,一键部署...

各位小伙伴&#xff0c;小Z课堂来袭&#xff0c;每天只需看三分钟&#xff0c;你就能用docker 快速部署各种环境。今天就用docker 来部署 elasticsearch 和 kibana。docker的入门请上度娘学习&#xff0c;这里直接进入实战。拉镜像镜像版本&#xff1a;base image&#xff1a;U…

数字有维度, 质数可追寻

摘要 用数轴的点表示数, 实际是把数的几何意义单一 化, 把所有实数同等化. 在研究素数的问题上, 应该挖掘数的 更多几何意义, 就正自然数而言, 不同区间的数, 几何意义是 不相同的, 对应的点是不同空间的点, 具有多样化的. 寻找质 数, 就是设法把不同空间的 1 维数 (质数) 找出…

局域网聊天程序 java MySQL_课内资源 - 基于JAVA的局域网聊天软件的设计与实现(仿制QQ)...

一、系统分析1.1 问题描述客户端实现简易版的局域网聊天器实现富文本内容聊天智能聊天机器人群发消息传送文件等功能服务器端实现群发通知管理聊天线程1.2 系统功能分析客户端功能登陆注册发送表情消息发送文本消息截取图片图片处理震动效果发送文件群发消息设置聊天文本样式服…

北工大一拟录取女研究生在网络发不当言论,已被网友举报!

近日&#xff0c;北工大一拟录取女研究生在自己的社交平台发表不当的言论。随后&#xff0c;其言论引起网友的热议。>>>>对于网友的质疑&#xff0c;其通过微博发文称&#xff0c;要“开小号专门打拳”。当天夜里&#xff0c;有网友通过其微博的公开的考研信息&…

java divide 用法_java中BigDecimal加减乘除基本用法

Java在java.math包中提供的API类BigDecimal&#xff0c;用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中&#xff0c;需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算&#xff0c;在商…

如何反映两条曲线的拟合精度_你知道850加工中心定位精度的检测有哪些吗?

你知道850加工中心定位精度的检测有哪些吗&#xff1f;定位精度在机械制造上指零件或刀具等实际位置与标准位置&#xff08;理论位置/理想位置&#xff09;之间的差距&#xff0c;其差距越小&#xff0c;说明精度越高。定位精度是零件加工精度得以保证的前提。XFL-850加工中心的…

java ee最新_从此再无 JavaEE,现在叫 JakartaEE

各位小伙伴,你们都知道这个消息吗&#xff1f;Java EE 正式改名为 Jakarta EE 了。以后小伙伴们自我介绍的时候又多了一种方式。(〃▽〃) &#xff1a;你是做什么的&#xff1f;(&#xffe3;▽&#xffe3;)~* &#xff1a;你好我是做 JakartaEE&#xff01;Σ(っД;)っ&#…

十二月份找工作好找吗_小儿推拿师工作好找吗?工资高吗?

小儿推拿师工作好找吗&#xff1f;会不会学成之后找不到工作?作为现在比较热门的一个医学类职业&#xff0c;小儿推拿师还是比较容易找工作的&#xff0c;现在基本一条街上能有不低于十家小儿推拿店&#xff0c;而这些店里面小儿推拿师只有两三个&#xff0c;后面孩子还有很多…

java 单例 读写锁_终极锁实战:单JVM锁+分布式锁

目录1.前言2.单JVM锁3.分布式锁4.总结正文分割线1.前言锁就像一把钥匙&#xff0c;需要加锁的代码就像一个房间。出现互斥操作的典型场景&#xff1a;多人同时想进同一个房间争抢这个房间的钥匙(只有一把)&#xff0c;一人抢到钥匙&#xff0c;其他人都等待这个人出来归还钥匙&…

linux java socket编程_深入学习socket网络编程,以java语言为例

了解java的socket编程与Linux Socket API之间的关系一、java的网络编程1、socket原理socket通信就是通过IP和端口号将两台主机建立连接&#xff0c;提供通信。主机A的应用程序要能和服务器B进行通信&#xff0c;必须通过Socket建立连接&#xff0c;而建立Socket连接本质上就是依…

python去掉空白行_python去掉空白行的多种实现代码

这篇文章主要介绍了python去掉空白行实现代码,需要的朋友可以参考下 测试代码 php.txt1:www.php.cn 2:www.php.cn 3:www.php.cn 4:www.php.cn 5:www.php.cn 6:www.php.cn 7:www.php.cn 8:www.php.cn 9:www.php.cn 10:www.php.cn 11:www.php.cn 12:www.php.cn 13:www.php.cn 14:…

html get请求_99% 的人都理解错了 HTTP 中 GET 与 POST 的区别【面试必问】

先分析一波&#xff1a;1、GET和POST与数据如何传递没有关系&#xff1f;&#xff1f;GET和POST是由HTTP协议定义的。那么使用哪个方式与应用层的数据如何传输是没有相互关系的。从而&#xff0c;HTTP就没有要求&#xff0c;POST一定要放到请求体里面&#xff0c;GET就一定要放…

hive load data外部表报错_生产SparkSQL如何读写本地外部数据源及排错

https://spark-packages.org/里有很多third-party数据源的package&#xff0c;spark把包加载进来就可以使用了csv格式在spark2.0版本之后是内置的&#xff0c;2.0之前属于第三方数据源一、读取本地外部数据源1.直接读取一个json文件[hadoophadoop000 bin]$ ./spark-shell --mas…

ffmpeg命令_使用ffmpeg命令为多个短视频修改视频备注说明

今天主要给大家讲一下使用视频剪辑高手中的ffmpeg命令为多个短视频修改备注说明的详细步骤&#xff0c;有需要和感兴趣的宝贝们可以跟随小编一起来试试。收集视频将需要剪辑的短视频保存到同一文件夹上进入软件双击进入视频剪辑高手&#xff0c;选择“批量剪辑视频”功能添加视…

从事python需要掌握哪些知识和技能_零基础想转行从事Python?需要掌握如下技能...

零基础python能找到工作吗&#xff1f;需要掌握哪些技能&#xff1f;对于大部分零基础学编程半路出家的人来说&#xff0c;无非是想改变现状换一门新职业&#xff0c;所谓技术大牛不过是比小白们更早接触编程罢了&#xff0c;选择好自己有兴趣的职业技能&#xff0c;并为之学习…

java byte 判断相等_你真的了解Java中quot;==quot;和equals()的区别?

部分面试资料链接:https://pan.baidu.com/s/1qDb2YoCopCHoQXH15jiLhA密码:jsam想获得全部面试必看资料&#xff0c;关注公众号&#xff0c;大家可以在公众号后台回复“知乎”即可。“判断两个事物是否相等”&#xff0c;是编程中最常见的操作之一&#xff0c;在Java中&#xff…

数据通信原理_同网段主机通信原理

本篇文章介绍数据通信中最基础&#xff0c;最关键的原理之一&#xff0c;两台通网段的主机如何通信。获得更多技术资料和免费学习视频&#xff0c;加入讨论群&#xff1a;752160765适合两台普通电脑之间&#xff0c;两台服务器之间&#xff0c;两台手机之间&#xff0c;电脑和打…

java jdk 未知错误_解决JAVA JDK安装出错的最常见问题,帮你排除困扰

一般来说&#xff0c;安装JAVA JDK的整个流程是很简单的&#xff0c;只要按照提示进行操作即可&#xff0c;就不会出现问题。但是呢&#xff0c;有小伙伴反映说&#xff0c;之前安装了JAVA JDK&#xff0c;进行卸载重装的时候出现错误提示&#xff0c;“正在进行另一Java安装”…

定义const变量是不可以赋值_JavaScript的声明方法和作用范围,常见的结构赋值类型和使用场景...

链接&#xff1a;https://juejin.im/post/5d9bf530518825427b27639d声明const命令&#xff1a;声明常量 let命令&#xff1a;声明变量作用作用域全局作用域函数作用域&#xff1a;function() {}块级作用域&#xff1a;{}作用范围var 命令在全局代码中执行const命令和let命令只能…