手写系列之手写promise - 图1


    实现手写promise,列举几个关键点:

    • 构造函数的resolve 或是 reject的value值,可能是Promise的实例,不是普通的值,需要再次调用then方法
    • then方法一定会返回一个新的promise
    • 处理resolve,reject函数返回值的时候,一定是迭代递归,直到是普通值为止
    1. /**
    2. * @author lihh
    3. * @desc 用来递归不断的new promise.then的
    4. * @param p 调用的实例
    5. * @param x 返回值
    6. * @param resolve 成功的回调
    7. * @param reject 失败的回调
    8. * @returns {*}
    9. */
    10. function nextPromise(p, x, resolve, reject) {
    11. if (p === x) {
    12. return reject(new TypeError('循环引用'))
    13. }
    14. // 判断是否是对象 以及函数 如果上述两者以外的 直接就按普通值来处理
    15. if ((x && typeof x === 'object') || typeof x === 'function') {
    16. let called = false
    17. try {
    18. const then = x.then
    19. // 判断是否是函数 如果不是函数 直接按普通值处理
    20. if (typeof then === 'function') {
    21. // 开始调用then
    22. then.call(
    23. x,
    24. (y) => {
    25. if (called) return
    26. called = true
    27. // 有可能then 的返回值还是promise,所以继续调用nextPromise 直到是普通值的时候
    28. nextPromise(p, y, resolve, reject)
    29. },
    30. (r) => {
    31. if (called) return
    32. called = true
    33. nextPromise(p, r, resolve, reject)
    34. }
    35. )
    36. } else {
    37. resolve(x)
    38. }
    39. } catch (e) {
    40. if (called) return
    41. called = true
    42. reject(e)
    43. }
    44. } else {
    45. resolve(x)
    46. }
    47. }
    48. // promise的几种状态
    49. const promiseStatus = {
    50. pending: 'pending',
    51. fulfilled: 'fulfilled',
    52. rejected: 'rejected',
    53. }
    54. class Promise1 {
    55. constructor(execute) {
    56. // 成功的返回值
    57. this.value = ''
    58. // promise的状态
    59. this.state = promiseStatus.pending
    60. // 失败的原因
    61. this.reason = ''
    62. // 延时时,成功的回调函数
    63. this.resolveCallback = []
    64. // 延时时,失败的回调函数
    65. this.rejectCallback = []
    66. // 成功的回调
    67. const onFulfilledHandle = (value) => {
    68. if (this.state !== promiseStatus.pending) return
    69. // 如果传递的数据是promise实例 再次调用then 做特殊处理
    70. if (value instanceof Promise1) {
    71. return value.then(onFulfilledHandle, onRejectedHandle)
    72. }
    73. this.state = promiseStatus.fulfilled
    74. this.value = value
    75. if (this.resolveCallback.length > 0) {
    76. let fn
    77. while ((fn = this.resolveCallback.shift())) {
    78. fn(this.value)
    79. }
    80. }
    81. }
    82. // 失败的回调
    83. const onRejectedHandle = (reason) => {
    84. if (this.state !== promiseStatus.pending) return
    85. if (reason instanceof Promise1) {
    86. return reason.then(onFulfilledHandle, onRejectedHandle)
    87. }
    88. this.state = promiseStatus.rejected
    89. this.reason = reason
    90. if (this.rejectCallback.length > 0) {
    91. let fn
    92. while ((fn = this.rejectCallback.shift())) {
    93. fn(this.reason)
    94. }
    95. }
    96. }
    97. try {
    98. // 立即执行传递的构造函数
    99. execute(onFulfilledHandle, onRejectedHandle)
    100. } catch (e) {
    101. // 异常的时候 直接调用错误信息
    102. onRejectedHandle(e)
    103. }
    104. }
    105. // then 会返回一个全新的promise
    106. then(onFulfilled, onRejected) {
    107. // 传递的then 有可能两个函数都没有 所以需要做特殊处理
    108. onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : (x) => x
    109. onRejected =
    110. typeof onRejected === 'function'
    111. ? onRejected
    112. : (err) => {
    113. throw err
    114. }
    115. let x
    116. // 如果状态还是等待中 说明是异步
    117. if (this.state === promiseStatus.pending) {
    118. const p2 = new Promise1((resolve, reject) => {
    119. this.resolveCallback.push((...args) => {
    120. try {
    121. x = onFulfilled(...args)
    122. nextPromise(p2, x, resolve, reject)
    123. } catch (e) {
    124. reject(e)
    125. }
    126. })
    127. this.rejectCallback.push((...args) => {
    128. try {
    129. x = onRejected(...args)
    130. nextPromise(p2, x, resolve, reject)
    131. } catch (e) {
    132. reject(e)
    133. }
    134. })
    135. })
    136. return p2
    137. }
    138. const p = new Promise1((resolve, reject) => {
    139. try {
    140. if (this.state === promiseStatus.fulfilled) {
    141. x = onFulfilled(this.value)
    142. }
    143. if (this.state === promiseStatus.rejected) {
    144. x = onRejected(this.reason)
    145. }
    146. nextPromise(p, x, resolve, reject)
    147. } catch (e) {
    148. reject(e)
    149. }
    150. })
    151. return p
    152. }
    153. catch(callback) {
    154. return this.then(null, callback)
    155. }
    156. // 全部执行结束 才算结束
    157. static all(arr) {
    158. const result = []
    159. let len = 0
    160. return new Promise1((resolve, reject) => {
    161. const callback = (i, res) => {
    162. result[i] = res
    163. len++
    164. if (len === arr.length) {
    165. resolve(result)
    166. }
    167. }
    168. let item = null
    169. for (let i = 0; i < arr.length, (item = arr[i]); i++) {
    170. if (item instanceof Promise1) {
    171. item.then((res) => {
    172. callback(i, res)
    173. }, reject)
    174. } else {
    175. callback(i, item)
    176. }
    177. }
    178. })
    179. }
    180. // 无论是成功的 还是 失败的 都会进行返回
    181. static allSettled(arr) {
    182. let len = 0
    183. const result = []
    184. return new Promise1((resolve, reject) => {
    185. const callback = (i, value, status) => {
    186. result[i] = { status, value }
    187. len++
    188. if (len === arr.length) {
    189. resolve(result)
    190. }
    191. }
    192. let item
    193. for (let i = 0; i < arr.length, (item = arr[i]); i++) {
    194. if (item instanceof Promise1) {
    195. item.then(
    196. (x) => {
    197. callback(i, x, 'fulfilled')
    198. },
    199. (y) => {
    200. callback(i, y, 'rejected')
    201. }
    202. )
    203. } else {
    204. callback(i, item, 'fulfilled')
    205. }
    206. }
    207. })
    208. }
    209. // 谁执行的快 返回谁
    210. static race(arr) {
    211. return new Promise1((resolve, reject) => {
    212. let item
    213. for (let i = 0; i < arr.length, (item = arr[i]); i++) {
    214. if (item instanceof Promise1) {
    215. item.then(resolve, reject)
    216. } else {
    217. resolve(item)
    218. }
    219. }
    220. })
    221. }
    222. // 直接返回promise的失败的状态
    223. static reject(value) {
    224. return new Promise1((resolve, reject) => {
    225. reject(value)
    226. })
    227. }
    228. // 直接返回promise的成功态
    229. static resolve(value) {
    230. return new Promise1((resolve) => {
    231. resolve(value)
    232. })
    233. }
    234. // 如果有成功的状态 直接返回第一个成功的状态 如果都不成功的话 返回第一个失败的状态
    235. static any(arr) {
    236. const failResult = []
    237. let len = 0
    238. return new Promise1((resolve, reject) => {
    239. const callback = (status, value) => {
    240. len++
    241. if (status === 'fulfilled') {
    242. resolve(value)
    243. } else {
    244. failResult.push(value)
    245. }
    246. if (len === arr.length) {
    247. resolve(failResult[0])
    248. }
    249. }
    250. let item
    251. for (let i = 0; i < arr.length, (item = arr[i]); i++) {
    252. item.then(
    253. (x) => {
    254. callback('fulfilled', x)
    255. },
    256. (y) => {
    257. callback('rejected', y)
    258. }
    259. )
    260. }
    261. })
    262. }
    263. }
    264. module.exports = Promise1