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. 从net到java:MyBatis快速入门

    第一:这不是net与java的对比,只是我学习java相关知识梳理的笔记. 第二:这也没有否认net,只是现在的工作需要自己会java. 第三:这不深入.只是我看了些官网和网上的视频,算是入门的总结. ...

  2. Jmeter教程 录制脚本

    Jmeter 录制脚本 Jmeter中有2种方法可以录制脚本.  不过我个人非常不推荐录制脚本,录制的脚本混乱,需要再次加工才能使用. 像我这么精通HTTP协议的人. 一直都是使用Fiddler来抓包 ...

  3. tensorflow summary demo with linear-model

    tf.summary + tensorboard 用来把graph图中的相关信息,如结构图.学习率.准确率.Loss等数据,写入到本地硬盘,并通过浏览器可视化之. 整理的代码如下: import te ...

  4. 微信小程序--聊天室小程序(云开发)

    微信小程序 -- 聊天室小程序(云开发) 从微信小程序开发社区更新watch接口之后,一直在构思这个项目.项目已经完成很久,但是一直都没有空写一篇博客记录展示一下. 开源地址 wx-cloud-im: ...

  5. docker run命令指定GPU多个显卡不生效的问题解决和代码示例

    问题描述:我有一个程序(app),需要用到显卡来跑.原本的部署方式 是直接修改程序的配置文件来指定要用到的显卡. 这是我服务器的显卡信息:总共3卡 分别是 0卡 ,1卡和2卡. [root@k8s-r ...

  6. Lambda@edge 实现负载均衡器功能

    一般的业务实现流程为CDN->ELB->EC2,但OTT业务往往会产生很高的流量费用,如果使用常规的架构,流量费用会成倍增加,为了降低费用,我们对架构做了一些优化. AWS Cloudfr ...

  7. 性能环境之docker操作指南4(全网最全)

    容器的常用操作 docker run -i -t  /bin/bash 使用image创建container并进入交互模式, login shell是/bin/bash 实例: $ docker ru ...

  8. layui的CRUD案列

    用layui来实现一个简单的二级权限和增删改查案列 利用layui提供的组件(table , layer , form,tree)来进行开发 写一个简单的登录界面   根据用户的ID来 获取用户所对应 ...

  9. Appium自动化(12) - 详解 HardwareActions 类里的方法和源码分析

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 HardwareAction ...

  10. Linux常用命令 - rm命令详解

    21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 删除/ ...