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…

xtrabackup备份mysql5.7_【 xtrabackup】CentOS7.x上基于 MySQL 5.7.x的XtraBackup 安装与备份还原...

MySQL的XtraBackup 备份与恢复https://shockerli.net/post/xtrabackup-backup-recovery-mysqlPercona XtraBackup 备份原理与实践http://www.unixfbi.com/349.htmlXtraBackup备份恢复模拟实践https://blog.51cto.com/13178102/2151512Percona XtraBackup 安装介绍篇https://www…

数字有维度, 质数可追寻

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

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

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

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

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

mysql微服务查询问题_【mysql】微服务架构下跨服务查询的聚合有什么好的方案?...

微服务架构中&#xff0c;每个服务都有自己的独立数据库。然而现在有个需求&#xff0c;需要生成一张实时的报表&#xff0c;该报表包含两个服务的数据。如服务A&#xff0c;服务B。B中仅包含A的主键id作为关联。而此报表的搜索条件包含A服务实体中的字段也包含B服务实体中的字…

mnist数据集svm python_python支持向量机分类MNIST数据集

支持向量机在高维或无限维空间中构造超平面或超平面集合&#xff0c;其可以用于分类、回归或其他任务。直观来说&#xff0c;分类边界距离最近的训练数据点越远越好&#xff0c;因为这样可以缩小分类器的泛化误差。调用sklearn.svm的svc函数&#xff0c;将MNIST数据集进行分类&…

mysql触发器可以使用正则表达式_SQL 正则表达式及mybatis中使用正则表达式

这篇文章主要介绍了SQL 正则表达式及mybatis中使用正则表达式的方法&#xff0c;非常不错&#xff0c;具有一定的参考借鉴价值,需要的朋友可以参考下mysql 提供的模式匹配的其他类型是使用扩展正则表达式。当你对这类模式进行匹配测试时&#xff0c;使用REGEXP和NOT REGEXP操作…

python代码200行左右_200行Python代码实现2048

import cursesfrom random import randrange,chiocefrom collections import defaultdictactions[Up,Left,Down,Right,Restart,Exit]letter_codes[ord(ch) for ch in WASDRQwasdrq]action_dictdict(zip(letter_codes,actions*2))def main(stdscr):def init():#重置游戏棋盘game…

python将excel导入mysql_Python将Excel数据自动导入MySQL,python,实现,excel,到,中

废话不多说&#xff0c;下面附上代码。# -*- coding: utf-8 -*-"""Created on Mon Apr 20 14:18:49 2020author: admin"""import osimport pandas as pd#import cx_Oracle as cxfrom sqlalchemy import create_engineimport pymysqlfile_name[]#…

presto java_Presto Jdbc

Presto Jdbc标签(空格分隔)&#xff1a; Presto一&#xff0c; 建立连接传统的JDBC方式类似&#xff0c;建立PrestoConnection”连接“&#xff0c;并且通过unwrap方法将connection转换为PrestoConnection。实际上是赋值一些基本信息&#xff0c;并且建立新的OkHttpClient。Str…

计算机二级java上机_计算机二级JAVA上机试题及答案

2016年9月计算机等级考试正在紧张复习中&#xff0c;为帮助大家进一步复习java&#xff0c;yjbys小编为大家带来最新java上机试题及答案如下&#xff1a;1. 基本操作(1小题&#xff0c;计30分)注意&#xff1a;下面出现的“考生文件夹”均为%USER%在考生文件夹中存有文件名为Ja…

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;其他人都等待这个人出来归还钥匙&…

怎么用python读取excel数据并导出_python怎样导入excel表格数据-如何使用python将大量数据导出到Excel中的小技巧...

如何用python将数据写入excel表格 #导入包 import xlrd #设置路径 pathC:\\Users\\jyjh\\Desktop\\datap.xlsx #打开文件 dataxlrd.open_workbook(path) #查询工作表 sheetsdata.sheets() sheets 可以通过函数、索引、名称获得工作表。 sheet_1_by_functiondata.sheets()[0] sh…

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

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