手写一个符合promiseA+规范的promise
    872 passing (16s)

    1. const PENDING = 'pending'
    2. const FULLFILLED = 'fullfilled'
    3. const REJECTED = 'rejected'
    4. class PromiseOfMine {
    5. constructor(executor) {
    6. // 捕获执行器的异常
    7. try {
    8. executor(this.resolve, this.reject)
    9. } catch (e) {
    10. this.reject(e)
    11. }
    12. }
    13. // promise的状态
    14. status = PENDING
    15. // 成功的值
    16. value = undefined
    17. // 失败的原因
    18. reason = undefined
    19. // 异步回调队列,用来放同一个promise多次then调用:p1.then(...); p1.then(...); p1.then(...);
    20. successCallback = []
    21. failCallback = []
    22. // 改变状态,执行异步回调
    23. resolve = (value) => {
    24. if (this.status !== PENDING) return
    25. this.status = FULLFILLED
    26. this.value = value
    27. while (this.successCallback.length) {
    28. this.successCallback.shift()()
    29. }
    30. }
    31. reject = (reason) => {
    32. if (this.status !== PENDING) return
    33. this.status = REJECTED
    34. this.reason = reason
    35. while (this.failCallback.length) {
    36. this.failCallback.shift()()
    37. }
    38. }
    39. // 判断状态,执行同步回调,如果是pending,就把异步回调存放起来,等到状态变更时触发
    40. then = (successCallback, failCallback) => {
    41. // 处理then没有参数的情况,把传过来的promise结果直接向后传递
    42. successCallback = typeof successCallback == 'function' ? successCallback : value => value
    43. failCallback = typeof failCallback == 'function' ? failCallback : reason => { throw reason }
    44. // 返回一个新的promise实现then的链式调用
    45. let newPromise = new PromiseOfMine((resolve, reject) => {
    46. // 执行同步回调
    47. if (this.status === FULLFILLED) {
    48. // setTimeout是为了保证resolvePromise变量已被声明
    49. setTimeout(() => {
    50. try {
    51. let x = successCallback(this.value)
    52. // 回调的结果x可能是一个普通值(没有返回值时是undefined),也可能是个promise,
    53. // 如果x是个普通值或者undefined,就直接resolve(x)传入新promise的then方法的成功回调
    54. // 如果x是个promise,就执行这个promise,判断这个promise的状态,根据状态调用resolve和reject
    55. resolvePromise(newPromise, x, resolve, reject)
    56. } catch (e) {
    57. reject(e)
    58. }
    59. }, 0)
    60. } else if (this.status === REJECTED) {
    61. setTimeout(() => {
    62. try {
    63. let x = failCallback(this.reason)
    64. resolvePromise(newPromise, x, resolve, reject)
    65. } catch (e) {
    66. reject(e)
    67. }
    68. }, 0)
    69. }
    70. // 把异步回调放到异步回调数组中,状态改变后会立刻处理
    71. else {
    72. this.successCallback.push(() => {
    73. setTimeout(() => {
    74. try {
    75. let x = successCallback(this.value)
    76. resolvePromise(newPromise, x, resolve, reject)
    77. } catch (e) {
    78. reject(e)
    79. }
    80. }, 0)
    81. })
    82. this.failCallback.push(() => {
    83. setTimeout(() => {
    84. try {
    85. let x = failCallback(this.reason)
    86. resolvePromise(newPromise, x, resolve, reject)
    87. } catch (e) {
    88. reject(e)
    89. }
    90. }, 0)
    91. })
    92. }
    93. })
    94. return newPromise
    95. }
    96. finally = (callback) => {
    97. return this.then(value => {
    98. // callback可能是个promise对象,需要等到他执行完在return
    99. return PromiseOfMine.resolve(callback()).then(() => value)
    100. }, reason => {
    101. return PromiseOfMine.reject(callback()).then(() => { throw reason })
    102. })
    103. }
    104. catch = (failCallback) => {
    105. return this.then(undefined, failCallback)
    106. }
    107. static all = (array) => {
    108. let result = []
    109. let process = 0
    110. return new PromiseOfMine((resolve, reject) => {
    111. function addData(index, value) {
    112. result[index] = value
    113. process++
    114. if (process === array.length) {
    115. resolve(result)
    116. }
    117. }
    118. for (let i = 0; i < array.length; i++) {
    119. if (array[i] instanceof PromiseOfMine) {
    120. array[i].then(value => { addData(i, value) }, reason => reject(reason))
    121. } else {
    122. addData(i, array[i])
    123. }
    124. }
    125. })
    126. }
    127. static race = (array) => {
    128. return new PromiseOfMine((resolve, reject) => {
    129. for (let i = 0; i < array.length; i++) {
    130. array[i].then(data => {
    131. resolve(data)
    132. }, err => {
    133. reject(err)
    134. })
    135. }
    136. })
    137. }
    138. static resolve = (value) => {
    139. if (value instanceof PromiseOfMine) {
    140. return value
    141. } else {
    142. return new PromiseOfMine(resolve => resolve(value))
    143. }
    144. }
    145. static reject = (reason) => {
    146. if (reason instanceof PromiseOfMine) {
    147. return reason
    148. } else {
    149. return new PromiseOfMine((undefined, reject) => reject(reason))
    150. }
    151. }
    152. }
    153. function resolvePromise(newPromise, x, resolve, reject) {
    154. // x就是newPromise
    155. if (newPromise === x) {
    156. return reject(new TypeError('error:promise循环调用'))
    157. }
    158. // x是一个函数或对象的情况,x就有可能是一个promise
    159. let called// 保证只能调用成功或者失败,不能让用户两个都调用
    160. if (x != null && (typeof x === 'function' || typeof x === 'object')) {
    161. try {
    162. let then = x.then;
    163. if (typeof then === 'function') {
    164. then.call(x, (value) => {
    165. if (called) {
    166. return
    167. } else {
    168. called = true
    169. }
    170. // value可能还是一个promise,所以递归处理, 直到最终返回一个普通值为止
    171. resolvePromise(newPromise, value, resolve, reject)
    172. }, (reason) => {
    173. if (called) {
    174. return
    175. } else {
    176. called = true
    177. }
    178. reject(reason)
    179. })
    180. } else {
    181. // x.then是普通值{then:123}
    182. resolve(x)
    183. }
    184. } catch (e) {
    185. if (called) {
    186. return
    187. } else {
    188. called = true
    189. }
    190. reject(e)
    191. }
    192. }
    193. // x是一个普通值
    194. else {
    195. resolve(x)
    196. }
    197. }
    198. PromiseOfMine.deferred = function () {
    199. let dfd = {};
    200. dfd.promise = new PromiseOfMine((resolve, reject) => {
    201. dfd.resolve = resolve;
    202. dfd.reject = reject;
    203. });
    204. return dfd;
    205. }
    206. module.exports = PromiseOfMine;