如何封装Promise对象?
最近看到了一个有趣的Promise的方法,这里记录下来
<script>
class MyPromise {
constructor(executor) {
// 初始化state赋值为pending
this.state = "pending";
// 定义成功的 值
this.value = undefined;
//定义失败的 原因
this.reason = undefined;
//定义成功存起来的数组
this.onResolvedCallbacks = [];
//定义失败存起来的数组
this.onRejectedCallbacks = [];
let resolve = (value) => {
// state改变,resolve调用就会失败
if (this.state === "pending") {
this.value = value;
//resolve调用后,state转为fulfilled
this.state = "fulfilled";
// 一旦resolve执行,调用成功数组的函数
this.onResolvedCallbacks.forEach(function (fn) {
return fn(value);
});
//也可以使用es6语法 简写
//this.onResolvedCallbacks.forEach(fn => fn(value));
}
};
let reject = (reason) => {
// state改变,reject调用就会失败
if (this.state === "pending") {
this.reason = reason;
// reject调用后,state转为失败状态
this.state = "rejected";
// 一旦reject执行,调用失败数组的函数
this.onRejectedCallbacks.forEach(fn => fn(reason)); //简写
}
}; // new MyPromise后的实例具有状态, 默认状态是等待,当执行器调用resolve后, 实例状态为成功状态;当执行器调用reject后,实例状态为失败状态
try {
executor(resolve, reject);
} catch (error) {
reject(error);
}
} // then中有两个参数 ,把第一个参数叫做then的成功回调,把第二个参数叫做then的失败回调,这两个参数也都是函数,当执行器调用resolve后,then中第一个参数函数会执行,当执行器调用reject后,then中第二个参数函数会执行
then(onFulfilled, onRejected) {
// 状态为fulfilled,执行onFulfilled,传入成功的值
if (this.state === "fulfilled") {
onFulfilled(this.value);
}
// 状态为rejected,执行onRejected,传入失败的原因
if (this.state === "rejected") {
onRejected(this.reason);
}
// 状态为pending时
if (this.state === "pending") {
// onFulfilled传入到成功数组
this.onResolvedCallbacks.push(onFulfilled);
// onRejected传入到失败数组
this.onRejectedCallbacks.push(onRejected);
}
}
}
//当new MyPromise实例 会立即调用constructor(executor)
let p = new MyPromise((resolve, reject) => {
console.log("开始");
setTimeout(function () {
resolve("我成功了");
}, 2000);
}); p.then(
(resolve) => {
console.log("success:" + resolve);
},
(reject) => {
console.log("error:" + reject);
}
);
console.log("结束");
</script>
如何封装Promise对象?的更多相关文章
- 回调函数 和 promise对象,及封装API接口
1.回调函数:https://blog.csdn.net/baidu_32262373/article/details/54969696 注意:回调函数不一定需要用到 return.如果浏览器支持Pr ...
- 使用promise对象封装一个ajaxGet函数
function promiseAjax(url,data){ var pro = new Promise(function(success,failed){ 承诺一 ...
- 用Promise对象封装JQuery的AJAX过程
let jqPostAjaxPromise = function(param){ return new Promise(function(resolve, reject){ $.ajax({ url: ...
- ES6深入学习记录(二)promise对象相关
1.Promise的含义 Promise是异步编程的一种解决方案,比传统的解决方案--回调函数和事件更合理和强大.ES6将其写进了语言标准,统一了用法,原生提供了promise对象. 所谓Promis ...
- JavaScript异步编程(1)- ECMAScript 6的Promise对象
JavaScript的Callback机制深入人心.而ECMAScript的世界同样充斥的各种异步操作(异步IO.setTimeout等).异步和Callback的搭载很容易就衍生"回调金字 ...
- ES6的promise对象研究
ES6的promise对象研究 什么叫promise? Promise对象可以理解为一次执行的异步操作,使用promise对象之后可以使用一种链式调用的方式来组织代码:让代码更加的直观. 那我们为什么 ...
- JavaScript 初识Promise 对象
什么是Promise? 其实, Promise就是一个类,而且这个类已经成为ES6的标准,是 ECMAScript 6 规范的重要特性之一.这个类目前在chrome32.Opera19.Firefox ...
- 前端基本知识(四):JS的异步模式:1、回调函数;2、事件监听;3、观察者模式;4、promise对象
JavaScript语言将任务的执行模式可以分成两种:同步(Synchronous)和异步(Asychronous). “同步模式”就是一个任务完成之后,后边跟着一个任务接着执行:程序的执行顺序和排列 ...
- 彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)
本文同步自我的个人博客: http://mly-zju.github.io/ 众所周知javascript语言的一大特色就是异步,这既是它的优点,同时在某些情况下也带来了一些的问题.最大的问题之一,就 ...
随机推荐
- ASP.NET Core 中间件的使用(二):依赖注入的使用
写在前面 上一篇大家已经粗略接触了解到.NET Core中间件的使用:ASP .Net Core 中间件的使用(一):搭建静态文件服务器/访问指定文件, .NET Core框架中很多核心对象都是通过依 ...
- pandas的学习5-导入导出数据
import pandas as pd ''' pandas可以读取与存取的资料格式有很多种,像csv.excel.json.html与pickle等-, 详细请看官方说明文件 ''' # read ...
- ActiveMq反序列化漏洞(CVE-2015-5254)漏洞复现
漏洞原理 Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类.远程攻击者可借助特制的序列化的Java Message Service( ...
- 从零到一快速搭建个人博客网站(域名自动跳转www,二级域名使用)(二)
前言 本篇文章是对上篇文章从零到一快速搭建个人博客网站(域名备案 + https免费证书)(一)的完善,比如域名自动跳转www.二级域名使用等. 域名自动跳转www 这里对上篇域名访问进行优化,首先支 ...
- javaweb练手项目jsp+servlet简易购物车系统
简易购物车项目 这是一个用intellij IDEA做的简易的javaweb项目,开发环境使用的jdk1.8和tomcat8以及mysql数据库. 1.项目开发准备: 创建github仓库 项目框架搭 ...
- Kubernetes K8S之Helm部署、使用与示例
Kubernetes K8S之Helm部署.使用.常见操作与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2 ...
- Java学习_反射
什么是反射? 反射就是Reflection,Java的反射是指程序在运行期可以拿到一个对象的所有信息. 反射是为了解决在运行期,对某个实例一无所知的情况下,如何调用其方法. JAVA反射机制是在运行状 ...
- 诡异的NPE--三目运算自动类型转换
今天在项目中碰到一个诡异的空指针异常的问题,刚开始很不解,明明自己做了空判断,为什么还是出现了空指针呢? 最后排查出来的原因是:三目运算符的自动类型匹配机制. 现场 java.lang.NullPoi ...
- Spring 之AOP AspectJ切入点语法详解
记录一下,以后学习 https://blog.csdn.net/zhengchao1991/article/details/53391244
- java面向对象的一些知识
(1)this和super关键字的用法 this表示调用本类实例方法和成员变量,this引用就是对一个对象的引用,如this.name 表示本类成员变量name,静态方法中不能使用this关键字. ...