Promise源码实现与测试
- const PENDING = 'pending',
- FULFILLED = 'fulfilled',
- REJECTED = 'rejected'
- class MyPromise {
- constructor(executor) {
- this.state = PENDING
- this.value = undefined
- this.reason = undefined
- this.onResolvedCallbacks = []
- this.onRejectedCallbacks = []
- let resolve = (value) => {
- if (this.state === PENDING) {
- this.state = FULFILLED
- this.value = value
- this.onResolvedCallbacks.forEach((fn) => fn())
- }
- }
- let reject = (reason) => {
- if (this.state === PENDING) {
- this.state = REJECTED
- this.reason = reason
- this.onRejectedCallbacks.forEach((fn) => fn())
- }
- }
- try {
- executor(resolve, reject)
- } catch (err) {
- reject(err)
- }
- }
- then(onFulFilled, onRejected) {
- let p2 = new MyPromise((resolve, reject) => {
- let x
- if (this.state === FULFILLED) {
- setTimeout(() => {
- x = onFulFilled(this.value)
- //resolve(x);
- resolvePromise(p2, x, resolve, reject)
- // x 决定 了 p2 的状态, resolve(x)或者 reject(x);
- }, 0)
- }
- if (this.state === REJECTED) {
- x = onRejected(this.reason)
- resolvePromise(p2, x, resolve, reject)
- }
- if (this.state === PENDING) {
- this.onResolvedCallbacks.push(() => {
- x = onFulFilled(this.value)
- resolvePromise(p2, x, resolve, reject)
- })
- this.onRejectedCallbacks.push(() => {
- x = onRejected(this.reason)
- resolvePromise(p2, x, resolve, reject)
- })
- }
- })
- return p2
- }
- }
- function resolvePromise(p2, x, resolve, reject) {
- if (p2 === x) {
- return new Error('引用错误')
- }
- // thenable 对象; blueBird q;
- if ((typeof x === 'object' && x !== null) || typeof x === 'function') {
- try {
- let then = x.then
- if (typeof then === 'function') {
- then.call(
- x,
- (y) => {
- resolvePromise(p2, y, resolve, reject)
- },
- (err) => {
- reject(err)
- }
- )
- }
- } catch (err) {
- reject(err)
- }
- } else {
- resolve(x)
- }
- }
- function test() {
- return new MyPromise((resolve, reject) => {
- setTimeout(() => {
- resolve(100)
- }, 1000)
- })
- }
- var p1 = test()
- // p1 => resolve(100) => p1.then(res) res => 100;
- // p2 => resolve(res) => p2.then(res) => res ??
- var p2 = p1.then(
- (res) => {
- // return {
- // then(resolve, reject) {
- // reject(100000);
- // }
- // };
- return new MyPromise((resolve, reject) => {
- resolve(
- new MyPromise((resolve, reject) => {
- resolve(
- new MyPromise((resolve, reject) => {
- resolve(100000000000)
- })
- )
- })
- )
- })
- },
- (err) => console.log(err)
- )
- p2.then(
- (res) => {
- console.log(res)
- },
- (err) => {
- console.log(err)
- }
- )
总结:实现源码需要解决的问题
Promise源码实现与测试的更多相关文章
- 机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理、源码解析及测试
机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理.源码解析及测试 关键字:决策树.python.源码解析.测试作者:米仓山下时间:2018-10-2 ...
- 这一次,彻底理解Promise源码思想
关于Promise的源码实现,网上有太多答案,我也看过很多资料,但都不是很明白.直到有一天我学完函数式编程之函子的概念,才对Promise源码有了更深刻的认识.今天,就让我们来重新认识一下Promis ...
- 史上最完整promise源码手写实现
史上最完整的promise源码实现,哈哈,之所以用这个标题,是因为开始用的标题<手写promise源码>不被收录 promise自我介绍 promise : "君子一诺千金,承诺 ...
- Tomcat源码导入Eclipse测试
想要研究下Tomcat的体系结构或者源码,最好将Tomcat的源码导入到ide中,编写实例进行代码跟踪(debug). 这里参考了网上一些资料,将自己操作过程记个流水账. 准备: 1.Tomcat源码 ...
- junit源码解析--捕获测试结果
OK,前面的博客我们整理了junit运行完了所有的测试用例,那么OK了,现在开始该收集测试结果了. 在这最后一步中,junit主要是玩一个类,TestResult.这里类中封装了几个参数,在初始化这个 ...
- promise源码解析
前言 大部分同学对promise,可能还停留在会使用es6的promise,还没有深入学习.我们都知道promise内部通过reslove.reject来判断执行哪个函数,原型上面的then同样的,也 ...
- Promise 源码分析
前言 then/promise项目是基于Promises/A+标准实现的Promise库,从这个项目当中,我们来看Promise的原理是什么,它是如何做到的,从而更加熟悉Promise 分析 从ind ...
- 使用Jenkins+Pipline 持构建自动化部署之安卓源码打包、测试、邮件通知
一.引言 Jenkins 2.x的精髓是Pipeline as Code,那为什么要用Pipeline呢?jenkins1.0也能实现自动化构建,但Pipeline能够将以前project中的配置信息 ...
- 使用Jenkins+Blue Ocean 持构建自动化部署之安卓源码打包、测试、邮件通知
什么是BlueOcean? BlueOcean重新考虑了Jenkins的用户体验.BlueOcean由Jenkins Pipeline设计,但仍然兼容自由式工作,减少了团队成员的混乱,增加了清晰度. ...
随机推荐
- 安全工具推荐之Goby篇
Goby(鰕虎鱼) 这个东西出来也很久了,有一年多了吧,个人感觉用起来还不错(当然见仁见智哈,别喷我),今天拿来水一篇 官网有很详细的使用说明,所以本文纯属发表一下感慨,非技术贴 官网在此:https ...
- 从零开始实现简单 RPC 框架 3:配置总线 URL
URL 的定义 URL 对于大部分程序猿来说都是很熟悉的,其全称是 Uniform Resource Locator (统一资源定位器).它是互联网的统一资源定位标志,也就是指网络地址. 一个标准的 ...
- 菜鸟的springboot常用注解总结
菜鸟的springboot常用注解总结 0.前言 可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景.对于每一个注解我都说了具体用 ...
- 异步编程之APM
一.APM概述 APM即异步编程模型的简写(Asynchronous Programming Model),我们平时经常会遇到类似BeginXXX和EndXXX的方法,我们在使用这些方法的时候,其实就 ...
- Ubuntu 16.04 LTS 64位系统 安装Docker
本文开发环境为Ubuntu 16.04 LTS 64位系统,通过apt的docker官方源安装最新的Docker CE(Community Edition),即Docker社区版,是开发人员和小型团队 ...
- Python的dict
dict把key和value关联起来,可以通过 key来查找 value. 花括号 {} 表示这是一个dict,然后按照 key: value, 写出来即可.最后一个 key: value 的逗号可以 ...
- Android Studio 百度地图导航
配置就不再多说了,上一篇已经详细说过了,这次就是根据经纬度坐标做地图导航,路径规划.直接上代码: package com.example.appview.mian_page.Frament.Anzhu ...
- ubuntu软件工具推荐
时间:2019-04-11 记录:PangYuaner 标题:串口调试利器--Minicom配置及使用详解 地址:https://www.cnblogs.com/wonux/p/5897127.htm ...
- 在CentOs7源码安装mysql-5.6.35单实例数据库
首先安装依赖包,避免在安装过程中出现问题 [root@bogon liuzhen]# yum -y install gcc gcc-c++[root@bogon liuzhen]# yum -y in ...
- GUI编程路线
基本路线