1.proomise 就是一个类,在执行这个类的时候 需要传递一个执行器进去, 执行器会立即执行
    2.Promise 中有三种状态, 分别是 成功/fulfilled 失败/rejected 等待/pending
    pending -> fulfilled
    pending -> rejected
    3.resolve 和 reject 函数是用来更改状态的
    resolve: fulfilled
    reject: rejected
    4.then 方法内部做的事情就是判断状态,如果状态是成功,调用成功后的回调函数,如果状态是失败,调用失败后的回调函数, then 方法是定义在 原型上的
    5.then方法成功回调有一个参数,表示成功后的值。then失败后回调有一个参数,表示失败后的原因

    1. //实现
    2. const PENDING = 'pending'; //等待
    3. const FULFILLED = 'fulfilled'; //成功
    4. const REJECTED = 'rejected'; //失败
    5. class MyPromise {
    6. constructor(executor) {
    7. executor(this.resolve, this.reject)
    8. }
    9. status = PENDING;
    10. value = undefined;
    11. reason = undefined;
    12. resolve = value => {
    13. //判断状态是否是等待转变的 (状态一旦更改就不可改变)
    14. if (this.status !== PENDING) return;
    15. //将状态更改为成功
    16. this.status = FULFILLED;
    17. this.value = value;
    18. }
    19. reject = reason => {
    20. //判断状态是否是等待转变的 (状态一旦更改就不可改变)
    21. if (this.status !== PENDING) return;
    22. //将状态更改为失败
    23. this.status = REJECTED;
    24. this.reason = reason;
    25. }
    26. then(successCallback, failCallback) {
    27. if (this.status === FULFILLED) {
    28. successCallback(this.value);
    29. } else if (this.status === REJECTED) {
    30. failCallback(this.reason);
    31. }
    32. }
    33. }
    34. module.exports = MyPromise

    打印实验:

    1. const MyPromise = require('./MyPromise')
    2. let promise = new MyPromise((reasolve, reject) => {
    3. reasolve('成功');
    4. })
    5. promise.then(value => {
    6. console.log(value);
    7. }, reason => {
    8. console.log(reason);
    9. })
    10. //console.log('成功');

    二、在promise中加入异步逻辑
    现在的调用如果加上异步 不会执行

    1. const MyPromise = require('./MyPromise')
    2. let promise = new MyPromise((reasolve, reject) => {
    3. setTimeout(() => {
    4. reasolve('成功');
    5. })
    6. })
    7. promise.then(value => {
    8. console.log(value);
    9. }, reason => {
    10. console.log(reason);
    11. })
    12. promise.then(value => {
    13. console.log(value);
    14. }, reason => {
    15. console.log(reason);
    16. })
    17. promise.then(value => {
    18. console.log(value);
    19. }, reason => {
    20. console.log(reason);
    21. })
    22. //console.log('成功');

    具体实现 拆分代码 待补充

    完整实现代码

    1. //实现
    2. /*
    3. 尽可能还原 Promise 中的每一个 API, 并通过注释的方式描述思路和原理.
    4. */
    5. // 状态
    6. const PENDING = 'pending'; //等待
    7. const FULFILLED = 'fulfilled'; //成功
    8. const REJECTED = 'rejected'; //失败
    9. // promise状态改变 就不会再更改 并且只能从等待转换状态
    10. // 等待 => 成功
    11. // 等待 => 失败
    12. class MyPromise {
    13. // promise会传入一个生成器 接受成功和失败方法
    14. constructor(executor) {
    15. try {
    16. executor(this.resolve, this.reject);
    17. // executor(resolve.bind(this), reject.bind(this)); 当不用箭头函数时
    18. } catch (e) {
    19. this.reject(e)
    20. }
    21. }
    22. // 用箭头函数的原因是this指向 调用resolve时是直接调用 所以会有this(window等)指向问题
    23. // resolve和reject是用来改变 promise 的状态的
    24. status = PENDING; //初始化状态为等待
    25. value = undefined; //成功返回的结果
    26. reason = undefined; //失败的原因
    27. //保存成功和失败回调
    28. successcallback = []; //成功回调 数组:多次调用
    29. failcallback = []; //失败回调 数组:多次调用
    30. resolve = value => {
    31. // 状态更改不可改变 判断是否是从等待转换过来的
    32. if (this.status != PENDING) return;
    33. // 改变promise的状态为成功
    34. this.status = FULFILLED;
    35. // 将 成功返回的结果 存储 方便成功后的回调函数 调用
    36. this.value = value;
    37. // 当异步任务结束时 看successcallback的长度 是否为0
    38. while (this.successcallback.length) this.successcallback.shift()(this.value)
    39. }
    40. reject = reason => {
    41. // 状态更改不可改变 判断是否是从等待转换过来的
    42. if (this.status != PENDING) return;
    43. // 改变promise的状态为失败
    44. this.status = REJECTED;
    45. // 将 失败的原因 存储 方便成功后的回调函数 调用
    46. this.reason = reason;
    47. // 当异步任务结束时 failcallback 是否存在
    48. while (this.failcallback.length) this.failcallback.shift()(this.reason)
    49. }
    50. // 方法 存放的是成功回调和失败回调
    51. then(succesback, failback) {
    52. // 将参数变为可选参数
    53. succesback = succesback ? succesback : value => value;
    54. failback = failback ? failback : reason => { throw reason };
    55. // 实现then方法的链式调用 就是返回一个Promise(这样才能调用then方法)
    56. let promise2 = new MyPromise((resolve, reject) => {
    57. if (this.status === FULFILLED) {
    58. setTimeout(() => {
    59. try {
    60. // 当状态为成功时 调用成功的回调
    61. let hui = succesback(this.value); //保存这个then方法的 回调
    62. // resolve(hui); //带着这个 个then的 回调
    63. resolvePromise(hui, promise2, resolve, reject);
    64. } catch (e) {
    65. reject(e)
    66. }
    67. }, 0)
    68. } else if (this.status === REJECTED) {
    69. setTimeout(() => {
    70. try {
    71. // 当状态为失败时 调用失败的回调
    72. let hui = failback(this.reason); //保存这个then方法的 回调
    73. // resolve(hui); //带着这个 个then的 回调
    74. resolvePromise(hui, promise2, resolve, reject);
    75. } catch (e) {
    76. reject(e)
    77. }
    78. }, 0)
    79. } else {
    80. //当前是 处理异步的情况
    81. // 当走到这里时 你无法知道一异步之后 该调用成功还是失败 所以将成功和失败 回调 保存起来先
    82. this.successcallback.push(() => {
    83. setTimeout(() => {
    84. try {
    85. // 当状态为成功时 调用成功的回调
    86. let hui = succesback(this.value); //保存这个then方法的 回调
    87. // resolve(hui); //带着这个 个then的 回调
    88. resolvePromise(hui, promise2, resolve, reject);
    89. } catch (e) {
    90. reject(e)
    91. }
    92. }, 0)
    93. });
    94. this.failcallback.push(() => {
    95. setTimeout(() => {
    96. try {
    97. // 当状态为失败时 调用失败的回调
    98. let hui = failback(this.reason); //保存这个then方法的 回调
    99. // resolve(hui); //带着这个 个then的 回调
    100. resolvePromise(hui, promise2, resolve, reject);
    101. } catch (e) {
    102. reject(e)
    103. }
    104. }, 0)
    105. });
    106. }
    107. })
    108. return promise2;
    109. }
    110. // 失败回调
    111. catch(failback) {
    112. return this.then(undefined, failback)
    113. }
    114. // 无论结果是成功 还是失败 都会返回一个结果
    115. finally(callback) {
    116. return this.then(value => {
    117. // 这里调用 resolve 静态方法
    118. return MyPromise.resolve(callback()).then(() => value)
    119. }, reason => {
    120. return MyPromise.resolve(callback()).then(reason => reason)
    121. })
    122. }
    123. //静态方法 允许按照异步代码调用的顺序 返回 相应结果的顺序
    124. static all(array) {
    125. let result = []; //结果数组
    126. let index = 0; //判断异步是否执行完成 就是判断index 得值 是否与 result 的长度相等
    127. return new MyPromise((resolve, reject) => {
    128. function add(i, value) {
    129. result[i] = value;
    130. index++;
    131. if (index == array.length) {
    132. resolve(result)
    133. }
    134. }
    135. for (let i = 0; i < array.length; i++) {
    136. let current = array[i];
    137. if (current instanceof MyPromise) {
    138. //是promise对象
    139. current.then(value => add(i, value), reason => reject(reason))
    140. } else {
    141. //普通值
    142. add(i, current);
    143. }
    144. }
    145. })
    146. }
    147. //返回一个解析过的Promise对象,如果参数本身就是一个Promise对象,则直接返回这个Promise对象
    148. static resolve(value) {
    149. if (value instanceof MyPromise) return value;
    150. return new MyPromise((resolve, reason) => {
    151. resolve(value)
    152. })
    153. }
    154. //返回一个解析过的Promise对象,如果参数本身就是一个Promise对象,则直接返回这个Promise对象
    155. static reject(value) {
    156. if (value instanceof MyPromise) return value;
    157. return new MyPromise((resolve, reason) => {
    158. reason(value)
    159. })
    160. }
    161. }
    162. //判断上一个返回的回调(hui) 是否是promise对象
    163. //如果是普通值 就直接调用 resolve()
    164. //如果是promise对象 查看promise返回的结果 调用then方法
    165. //再根据返回的结果 调用相应的成功方法和失败方法
    166. function resolvePromise(hui, promise2, resolve, reject) {
    167. if (promise2 === hui) {
    168. return reject(new TypeError('lsdhflsdb'))
    169. }
    170. if (hui instanceof MyPromise) {
    171. // 判断是否是promise 对象
    172. hui.then(resolve, reject)
    173. } else {
    174. // 否则是 普通值
    175. resolve(hui)
    176. }
    177. }
    178. module.exports = MyPromise;