尝试实现一个简单的Promise
1 Promise 是一个异步操作返回的对象,用来传递异步操作的消息
2 根据自己对 Promise 的理解,实现一个Promise
Promise 有三种状态:Pending 初始态; Fulfilled 成功态; Rejected 失败态。
function Promise(executor) {let self = this;self.status = 'pending'; //等待态self.value = undefined; //成功的返回值self.reason = undefined; //失败的原因function resolve(value){if(self.status === 'pending'){self.status = 'resolved';self.value = value;}}function reject(reason) {if(self.status === 'pending') {self.status = 'rejected';self.reason = reason;}}try{executor(resolve, reject);}catch(e){reject(e);// 捕获时发生异常,就直接失败}
}//onFufiled 成功的回调
//onRejected 失败的回调
Promise.prototype.then = function (onFufiled, onRejected) {let self = this;if(self.status === 'resolved'){onFufiled(self.value);}if(self.status === 'rejected'){onRejected(self.reason);}
}
module.exports = Promise;
3 代码测试
let Promise = require('./Promise');let promise = new Promise(function (resolve, reject) {resolve(100);
})promise.then(function (data) {console.log('data:', data);
},function (err) {console.log('err:', err);
})
输出:data: 100
Promise 实例可以多次then,当成功后会将 then 中的成功方法按顺序执行,我们可以先将 then 中成功的回调和失败的回调存到数组内。当成功的时候调用成功的数组即可。
self.onResolvedCallbacks = []; /* 存放then成功的回调*/
self.onRejectedCallbacks = []; /* 存放then失败的回调*/
function resolve(value){if(self.status === 'pending'){self.status = 'resolved';self.value = value;self.onResolvedCallbacks.forEach(function (fn) {fn();})}
}
function reject(reason) {if(self.status === 'pending') {self.status = 'rejected';self.reason = reason;self.onRejectedCallbacks.forEach(function (fn) {fn();})}
}
if(self.status === 'pending'){self.onResolvedCallbacks.push(function () {onFufiled(self.value);})self.onRejectedCallbacks.push(function () {onRejected(self.reason);})
}
4 实现链式调用
众所周知 Promise 的一大特点,就是链式调用。而 Promise 实现链式调用就是通过 then 方法返回一个新的 Promise。
如果第一个 then 中返回了一个结果,会将 Promise 的结果继续传给下一个 then 中;如果有错误则走下一个 then 的失败。
// 添加 resolvePromise 方法 处理链式调用问题
function resolvePromise(p2, x, resolve, reject) {if(p2 === x){return reject(new TypeError('循环引用'));}if(x!==null || (typeof x === 'object' || typeof x === 'function')){try{let then = x.then;if(typeof then === 'function'){then.call(x, function (y) {resolvePromise(promise2, y, resolve, reject);},function (err) {reject(err);});}else{resolve(x);}}catch(e){reject(e);}}else{resolve(x);}
}
尝试实现一个简单的Promise相关推荐
- 你已经学会了基本的c语言了,来尝试写一个简单的计算器吧
关于原问题 第一行输入两个整数,用空格分开: 第二行输入一个运算符(+.-.*./). 所有运算均为整数运算,保证除数不包含0. 这里我们选择switch函数 switch(c){case '+':p ...
- promise是什么?简单分析promise原理
预备知识 回调函数 高级函数 发布-订阅模式 promise A+ 规范 promise是什么,能干什么 Promise是异步编程的一种解决方案,它可以解决异步回调地狱的问题,防止层层嵌套对程序代码带 ...
- 电影推荐系统 python简书_分析9000部电影|一个简单的电影推荐系统
不知道大家平时喜不喜欢看电影来消遣时光,我是比较喜欢看电影的.对我而言,当我看完一部电影,觉得很好看的时候,我就会寻找类似这部电影的其他电影.刚好有这么一个数据集,包含了很多部的电影,于是打算对其进行 ...
- 如何写shell脚本?尝试自己编写一个简单脚本。
1 背景介绍 每次发布tomcat项目的时候都要反复敲一些命令,重启tomcat之前先检查tomcat进程有没有停掉,没有还要手动kill该进程,单独部署一个项目还好,如果一次多个部署,就比较费劲了 ...
- 使用redis实现缓存_用下一个js实现一个简单的redis缓存
使用redis实现缓存 For most websites, the changing pieces don't actually vary that often. That immutability ...
- 用php做一个简单的汇率,vue实现简单实时汇率计算功能
最近在自己摸索vue的使用,因为相对于只是去看教程和实例,感觉不如自己动手写一个demo入门来的快.刚好看到小程序中有一个简单但是很精致的应用极简汇率,而且它的表现形式和vue的表现形式很像,于是想着 ...
- 用 cooking 搭建一个简单又优雅的 Vue 项目开发环境 (入门篇)
本文适合 Vue 的初学者,以及对 webpack 不熟悉的同学阅读.前提是你要会用基本的命令行. Node 和 NPM,以及掌握 ES2015 的基础知识.本文都是在 macOS 环境下运行,要求使 ...
- python如何编写数据库_如何在几分钟内用Python编写一个简单的玩具数据库
python如何编写数据库 MySQL, PostgreSQL, Oracle, Redis, and many more, you just name it - databases are a re ...
- 如何在 Python 中创建一个简单的神经网络
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 引言 在过去的几十年里,机器学习对世界产生了巨大的影响,而且它的普 ...
最新文章
- MYSQL 连接数据库命令收藏
- PHP+Mysql数据库操作简类
- 必看!程序员逃生指南
- 阿里宣布Atlas正式开源:带你重返App开发的田园时代
- 数据库时间字段条件操作善用TO_DAYS函数等
- java stream中Collectors的用法
- 编译时错误之 error C2338: tuple_element index out of bounds
- c语言指着与数组,C语言指针与数组
- Data URI scheme 在 html 中嵌入小图片
- python的数据库_python数据库操作-mysql数据库
- 检测直线方法 python
- python客户画像_Python数据分析学习笔记05:用户画像
- Redis内存分析方法
- 人人都可以开发高可用高伸缩应用——论Azure Service Fabric的意义
- 初学者如何选择网络仿真软件
- 未来互联网+大数据时代
- java jvm sdk_JDK、SDK、JRE、JVM概念详解
- JavaScript复习笔记(三)数组及数组API
- 外贸独立站怎么提高转化率
- Js模拟重力场【Js动效】
热门文章
- Okhttp请求工具类
- Feed 流系统杂谈
- xdebug 调试php,怎么用Xdebug调试PHP
- 全球「数字游民」现状,有人已经72岁了
- [C++] [OpenGL] GLFW工具类
- 老话题新解说:究竟什么是敏捷测试?
- 数据表的基础操作(三)修改
- ldap数据库--ldapsearch,ldapmodify
- Win10 笔记本无线网卡Intel(R) Wireless-AC 9560无法启动 报错代码: 10 网络适配器里面也没有WLAN WIFI突然没了 不能搜索WIFI 该怎么办 解决经验分享
- C++:stat函数