1. Promise就是一个类 在执行这个类的时候需要传递一个执行器进去,执行器会立即执行
    2. Promise中有三种状态:成功(fulfilled)、失败(rejected)和等待(pending),一旦状态确定就不能改,状态只能从等待变为成功或者变为失败
    3. resolve和reject函数是用来更改状态的
    4. then方法内部做的事情就是判断状态,如果状态是成功 调用成功的回调函数。then方法是被定义在原型对象中的
    5. then成功回调有一个参数 表示成功之后的值,失败回调参数表示失败的原因
    6. then方法可以被多次调用
    7. then方法是可以被链式调用的,后面then方法的回调函数拿到的值是上一个then方法的回调函数的返回值
    8. then方法的参数是可选参数
    1. const PENDING = 'pending'
    2. const FULFILLED = 'fulfilled'
    3. const REJECTED = 'rejected'
    4. class MyPromise {
    5. constructor (executor) {
    6. try {
    7. executor(this.resolve, this.reject)
    8. } catch (e) {
    9. this.reject(e)
    10. }
    11. }
    12. status = PENDING
    13. // 成功之后的值
    14. value = undefined
    15. // 失败之后的原因
    16. reason = undefined
    17. // 成功回调
    18. successCallback = []
    19. // 失败回调
    20. failCallback = []
    21. resolve = value => {
    22. // 如果状态不是等待 阻止程序向下执行
    23. if(this.status !== PENDING) return
    24. this.status = FULFILLED
    25. this.value = value
    26. // 判断成功回调是否存在 如果存在就调用
    27. while(this.successCallback.length){
    28. this.successCallback.shift()()
    29. }
    30. }
    31. reject = reason => {
    32. // 如果状态不是等待 阻止程序向下执行
    33. if(this.status !== PENDING) return
    34. this.status = REJECTED
    35. this.reason = reason
    36. // 判断失败回调是否存在 如果存在就调用
    37. while(this.failCallback.length){
    38. this.failCallback.shift()()
    39. }
    40. }
    41. then (successCallback, failCallback) {
    42. // 如果不传参数或者传递的不是函数 那就补充一个函数
    43. if(Object.prototype.toString.call(successCallback) !== "[object Function]"){
    44. successCallback = value => value
    45. }
    46. if(Object.prototype.toString.call(failCallback) !== "[object Function]"){
    47. failCallback = reason => { throw reason }
    48. }
    49. let promise2 = new MyPromise((resolve,reject) => {
    50. if(this.status === FULFILLED) {
    51. queueMicrotask(()=> {
    52. try{
    53. // 上一个then的成功回调返回值
    54. let x = successCallback(this.value)
    55. // 判断 x 的值是普通值还是promise对象
    56. // 如果是普通值,直接调用resolve
    57. // 如果是promise对象 查看promise对象返回的结果
    58. // 再根据promise对象返回的结果 决定调用resolve 还是调用reject
    59. resolvePromise(promise2,x,resolve,reject)
    60. }catch (e) {
    61. reject(e)
    62. }
    63. })
    64. } else if(this.status === REJECTED) {
    65. queueMicrotask(()=> {
    66. try{
    67. // 上一个then的成功回调返回值
    68. let x = failCallback(this.reason)
    69. // 判断 x 的值是普通值还是promise对象
    70. // 如果是普通值,直接调用resolve
    71. // 如果是promise对象 查看promise对象返回的结果
    72. // 再根据promise对象返回的结果 决定调用resolve 还是调用reject
    73. resolvePromise(promise2,x,resolve,reject)
    74. }catch (e) {
    75. reject(e)
    76. }
    77. })
    78. } else {
    79. // 等待
    80. // 将成功回调和失败回调存储起来
    81. this.successCallback.push(()=> {
    82. queueMicrotask(()=> {
    83. try{
    84. // 上一个then的成功回调返回值
    85. let x = successCallback(this.value)
    86. // 判断 x 的值是普通值还是promise对象
    87. // 如果是普通值,直接调用resolve
    88. // 如果是promise对象 查看promise对象返回的结果
    89. // 再根据promise对象返回的结果 决定调用resolve 还是调用reject
    90. resolvePromise(promise2,x,resolve,reject)
    91. }catch (e) {
    92. reject(e)
    93. }
    94. })
    95. })
    96. this.failCallback.push(() => {
    97. queueMicrotask(()=> {
    98. try{
    99. // 上一个then的成功回调返回值
    100. let x = failCallback(this.reason)
    101. // 判断 x 的值是普通值还是promise对象
    102. // 如果是普通值,直接调用resolve
    103. // 如果是promise对象 查看promise对象返回的结果
    104. // 再根据promise对象返回的结果 决定调用resolve 还是调用reject
    105. resolvePromise(promise2,x,resolve,reject)
    106. }catch (e) {
    107. reject(e)
    108. }
    109. })
    110. })
    111. }
    112. })
    113. return promise2
    114. }
    115. }
    116. function resolvePromise(promise2, x, resolve, reject){
    117. if(promise2 === x) {
    118. return reject(new TypeError(""))
    119. }
    120. if(x instanceof MyPromise) {
    121. // promise对象
    122. x.then(resolve, reject)
    123. } else {
    124. // 普通值
    125. resolve(x)
    126. }
    127. }
    • 如果promise.then返回的是它本身返回的promise,就会出现循环调用promise的错误
    1. var promise = new Promise((resolve, reject) => {
    2. resolve(100)
    3. })
    4. var p1 = promise.then(val => {
    5. console.log(val)
    6. return p1 // 会出现循环调用的情况
    7. })
    8. p1.then(() => {}, err => {
    9. console.log(err) // 系统的promise能识别循环调用的错误
    10. })
    • Promise.all方法实现
      • 接受一个数组,会按照数组中元素的顺序调用异步代码执行,得到的结果就是调用的顺序
      • 返回一个promise,支持链式调用
      • 数组中所有promise都是成功的,才会变为成功状态,只要有一个失败 就会变为失败状态
    1. class MyPromise() {
    2. static all (array) {
    3. let result = []
    4. let index = 0
    5. return new MyPromise((resolve, reject) => {
    6. function addData(key, value) {
    7. result[key] = value
    8. index ++;
    9. if(index === array.length) {
    10. resolve(result)
    11. }
    12. }
    13. for(let i = 0; i < array.length; i++) {
    14. let current = array[i];
    15. if(current instanceof MyPromise) {
    16. // promise对象
    17. current.then(value => addData(i, value), error => reject(error))
    18. }else {
    19. // 普通值
    20. addData(i, array[i])
    21. }
    22. }
    23. })
    24. }
    25. }
    • Promise.resolve方法实现
    1. class MyPromise {
    2. static resolve (value) {
    3. if(value instanceof MyPromise) {
    4. // 参数是promise
    5. return value
    6. } else {
    7. // 不是promise
    8. return new MyPromise(resolve => resolve(value))
    9. }
    10. }
    11. }
    • finally方法

      不管成功还是失败都会执行

    1. class MyPromise {
    2. finally(callback) {
    3. return this.then(value => {
    4. return MyPromise.resolve(callback()).then(() => value)
    5. }, error => {
    6. return MyPromise.resolve(callback()).then(() => error)
    7. })
    8. }
    9. }
    • catch方法
    1. class MyPromise {
    2. catch(failCallback) {
    3. return this.then(undefined, failCallback)
    4. }
    5. }