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 源码~ 
    1. 异步的问题;
    2. 链式调用 => return this ?
    3.在初始化之前调用值的? 
    4. 递归的问题;

Promise源码实现与测试的更多相关文章

  1. 机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理、源码解析及测试

    机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理.源码解析及测试 关键字:决策树.python.源码解析.测试作者:米仓山下时间:2018-10-2 ...

  2. 这一次,彻底理解Promise源码思想

    关于Promise的源码实现,网上有太多答案,我也看过很多资料,但都不是很明白.直到有一天我学完函数式编程之函子的概念,才对Promise源码有了更深刻的认识.今天,就让我们来重新认识一下Promis ...

  3. 史上最完整promise源码手写实现

    史上最完整的promise源码实现,哈哈,之所以用这个标题,是因为开始用的标题<手写promise源码>不被收录 promise自我介绍 promise : "君子一诺千金,承诺 ...

  4. Tomcat源码导入Eclipse测试

    想要研究下Tomcat的体系结构或者源码,最好将Tomcat的源码导入到ide中,编写实例进行代码跟踪(debug). 这里参考了网上一些资料,将自己操作过程记个流水账. 准备: 1.Tomcat源码 ...

  5. junit源码解析--捕获测试结果

    OK,前面的博客我们整理了junit运行完了所有的测试用例,那么OK了,现在开始该收集测试结果了. 在这最后一步中,junit主要是玩一个类,TestResult.这里类中封装了几个参数,在初始化这个 ...

  6. promise源码解析

    前言 大部分同学对promise,可能还停留在会使用es6的promise,还没有深入学习.我们都知道promise内部通过reslove.reject来判断执行哪个函数,原型上面的then同样的,也 ...

  7. Promise 源码分析

    前言 then/promise项目是基于Promises/A+标准实现的Promise库,从这个项目当中,我们来看Promise的原理是什么,它是如何做到的,从而更加熟悉Promise 分析 从ind ...

  8. 使用Jenkins+Pipline 持构建自动化部署之安卓源码打包、测试、邮件通知

    一.引言 Jenkins 2.x的精髓是Pipeline as Code,那为什么要用Pipeline呢?jenkins1.0也能实现自动化构建,但Pipeline能够将以前project中的配置信息 ...

  9. 使用Jenkins+Blue Ocean 持构建自动化部署之安卓源码打包、测试、邮件通知

    什么是BlueOcean? BlueOcean重新考虑了Jenkins的用户体验.BlueOcean由Jenkins Pipeline设计,但仍然兼容自由式工作,减少了团队成员的混乱,增加了清晰度. ...

随机推荐

  1. @ImportResource-SpringBoot使用xml配置Bean

    前言 SpringBoot推荐使用注解的方式去声明bean,但还是提供了xml的方式去加载bean 一.创建要声明为bean的实体类 WzqEntity.java package com; /** * ...

  2. (四)HXDZ-30102-ACC检测心率血氧数据并通过串口助手显示

    主要参考模块说明书 写在前面的话 硬件原理我是真的搞不明白,所以心率血氧传感器数据检测就是模块卖家自带的代码... 我使用HXDZ-30102-ACC传感器也是偶然在网上检索到的,集成心率血氧和三轴加 ...

  3. 在Spring中使用静态工厂时发生的无法得到对象的问题

    因为我测试时,使用的是之前的包Spring 3.x一类的jar包,发现我的代码毫无问题,但是就是运行不出来,后面去Spring官网上发现,JDK6+至少都要使用Spring4.x了,而为了配合JDK8 ...

  4. Acwing 883高斯消元法的运用

    Acwing 883高斯消元法的运用 解线性方程组 Acwing 883 输入一个包含 n 个方程 n 个未知数的线性方程组. 方程组中的系数为实数. 求解这个方程组. 下图为一个包含 m 个方程 n ...

  5. OVN入门

    参考链接 如何借助 OVN 来提高 OVS 在云计算环境中的性能 OVN简介 Open vSwitch Documentation OVSDB介绍及在OpenDaylight中的调用 OpenDayl ...

  6. springcloud <zuul2.0静态配置>

    server: port: 9006 spring: application: name: cloud-zuul-wangbiao # zipkin: # base-url: http://local ...

  7. Maven无法导入插件,pom文件报错

    最近在使用IDEA导入开源项目bootshiro,更新依赖的时候,发现有些插件无法导入,以致于pom文件一直报找不到该插件的错误 一开始就网上各种百度,无论怎么更换阿里云的镜像都导不进,最后想着试试自 ...

  8. vscode Markdown Preview Enhanced 安装配置

    打开VSCode 打开Externsion,可通过Ctrl+Shift+X 选中 Markdown Preview Enhanced并install即可 配置Preview风格: Magage -&g ...

  9. linux centos7 “git clone https://github.com/XXXXX” 报错解决方法

    2021-08-04 1. 问题描述 在执行以下命令时出现错误"正克隆到 'XXXXX'... fatal: unable to access 'https://github.com/lag ...

  10. golang error错误处理

    error定义 数据结构 go语言error是一普通的值,实现方式为简单一个接口. // The error built-in interface type is the conventional i ...