1. const PENDING = 'pending',
  2. FULFILLED = 'fulfilled',
  3. REJECTED = 'rejected'
  4.  
  5. class MyPromise {
  6. constructor(executor) {
  7. this.state = PENDING
  8. this.value = undefined
  9. this.reason = undefined
  10. this.onResolvedCallbacks = []
  11. this.onRejectedCallbacks = []
  12.  
  13. let resolve = (value) => {
  14. if (this.state === PENDING) {
  15. this.state = FULFILLED
  16. this.value = value
  17. this.onResolvedCallbacks.forEach((fn) => fn())
  18. }
  19. }
  20.  
  21. let reject = (reason) => {
  22. if (this.state === PENDING) {
  23. this.state = REJECTED
  24. this.reason = reason
  25. this.onRejectedCallbacks.forEach((fn) => fn())
  26. }
  27. }
  28. try {
  29. executor(resolve, reject)
  30. } catch (err) {
  31. reject(err)
  32. }
  33. }
  34.  
  35. then(onFulFilled, onRejected) {
  36. let p2 = new MyPromise((resolve, reject) => {
  37. let x
  38. if (this.state === FULFILLED) {
  39. setTimeout(() => {
  40. x = onFulFilled(this.value)
  41. //resolve(x);
  42.  
  43. resolvePromise(p2, x, resolve, reject)
  44.  
  45. // x 决定 了 p2 的状态, resolve(x)或者 reject(x);
  46. }, 0)
  47. }
  48.  
  49. if (this.state === REJECTED) {
  50. x = onRejected(this.reason)
  51. resolvePromise(p2, x, resolve, reject)
  52. }
  53.  
  54. if (this.state === PENDING) {
  55. this.onResolvedCallbacks.push(() => {
  56. x = onFulFilled(this.value)
  57. resolvePromise(p2, x, resolve, reject)
  58. })
  59. this.onRejectedCallbacks.push(() => {
  60. x = onRejected(this.reason)
  61. resolvePromise(p2, x, resolve, reject)
  62. })
  63. }
  64. })
  65.  
  66. return p2
  67. }
  68. }
  69.  
  70. function resolvePromise(p2, x, resolve, reject) {
  71. if (p2 === x) {
  72. return new Error('引用错误')
  73. }
  74. // thenable 对象; blueBird q;
  75. if ((typeof x === 'object' && x !== null) || typeof x === 'function') {
  76. try {
  77. let then = x.then
  78. if (typeof then === 'function') {
  79. then.call(
  80. x,
  81. (y) => {
  82. resolvePromise(p2, y, resolve, reject)
  83. },
  84. (err) => {
  85. reject(err)
  86. }
  87. )
  88. }
  89. } catch (err) {
  90. reject(err)
  91. }
  92. } else {
  93. resolve(x)
  94. }
  95. }
  96. function test() {
  97. return new MyPromise((resolve, reject) => {
  98. setTimeout(() => {
  99. resolve(100)
  100. }, 1000)
  101. })
  102. }
  103.  
  104. var p1 = test()
  105. // p1 => resolve(100) => p1.then(res) res => 100;
  106. // p2 => resolve(res) => p2.then(res) => res ??
  107.  
  108. var p2 = p1.then(
  109. (res) => {
  110. // return {
  111. // then(resolve, reject) {
  112. // reject(100000);
  113. // }
  114. // };
  115. return new MyPromise((resolve, reject) => {
  116. resolve(
  117. new MyPromise((resolve, reject) => {
  118. resolve(
  119. new MyPromise((resolve, reject) => {
  120. resolve(100000000000)
  121. })
  122. )
  123. })
  124. )
  125. })
  126. },
  127. (err) => console.log(err)
  128. )
  129.  
  130. p2.then(
  131. (res) => {
  132. console.log(res)
  133. },
  134. (err) => {
  135. console.log(err)
  136. }
  137. )

  总结:实现源码需要解决的问题

      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. 安全工具推荐之Goby篇

    Goby(鰕虎鱼) 这个东西出来也很久了,有一年多了吧,个人感觉用起来还不错(当然见仁见智哈,别喷我),今天拿来水一篇 官网有很详细的使用说明,所以本文纯属发表一下感慨,非技术贴 官网在此:https ...

  2. 从零开始实现简单 RPC 框架 3:配置总线 URL

    URL 的定义 URL 对于大部分程序猿来说都是很熟悉的,其全称是 Uniform Resource Locator (统一资源定位器).它是互联网的统一资源定位标志,也就是指网络地址. 一个标准的 ...

  3. 菜鸟的springboot常用注解总结

    菜鸟的springboot常用注解总结 0.前言 可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景.对于每一个注解我都说了具体用 ...

  4. 异步编程之APM

    一.APM概述 APM即异步编程模型的简写(Asynchronous Programming Model),我们平时经常会遇到类似BeginXXX和EndXXX的方法,我们在使用这些方法的时候,其实就 ...

  5. Ubuntu 16.04 LTS 64位系统 安装Docker

    本文开发环境为Ubuntu 16.04 LTS 64位系统,通过apt的docker官方源安装最新的Docker CE(Community Edition),即Docker社区版,是开发人员和小型团队 ...

  6. Python的dict

    dict把key和value关联起来,可以通过 key来查找 value. 花括号 {} 表示这是一个dict,然后按照 key: value, 写出来即可.最后一个 key: value 的逗号可以 ...

  7. Android Studio 百度地图导航

    配置就不再多说了,上一篇已经详细说过了,这次就是根据经纬度坐标做地图导航,路径规划.直接上代码: package com.example.appview.mian_page.Frament.Anzhu ...

  8. ubuntu软件工具推荐

    时间:2019-04-11 记录:PangYuaner 标题:串口调试利器--Minicom配置及使用详解 地址:https://www.cnblogs.com/wonux/p/5897127.htm ...

  9. 在CentOs7源码安装mysql-5.6.35单实例数据库

    首先安装依赖包,避免在安装过程中出现问题 [root@bogon liuzhen]# yum -y install gcc gcc-c++[root@bogon liuzhen]# yum -y in ...

  10. GUI编程路线

    基本路线