定义整体结构

  1. /*
  2. 自定义 Promise 函数模块:IFFE 立即调用函数模块
  3. */
  4. (function (window) {
  5. const PENDING = 'pending'
  6. const RESOLVED = 'resolved'
  7. const REJECTED = 'rejected'
  8. /*
  9. Promise 构造函数
  10. executor:执行器函数(同步执行)
  11. */
  12. function Promise (executor) {}
  13. /*
  14. Promise 原型对象的 then()
  15. 返回一个新的 promise 对象
  16. 返回的 promise 的结果由 onResolved/onRejected 执行的结果决定
  17. */
  18. Promise.prototype.then = function (onResolved, onRejected) {}
  19. /* Promise 原型对象的 catch()
  20. 返回一个新的 promise 对象*/
  21. Promise.prototype.catch = function (onRejected) {
  22. return this.then(undefined, onRejected)
  23. }
  24. /* Promise 函数对象 resolve() */
  25. Promise.resolve = function (value) {}
  26. /* Promise 函数对象 reject() */
  27. Promise.reject = function (reason) {}
  28. /* Promise 函数对象 all()
  29. 返回一个新的 promise 对象,只有当所有promise成功才成功,有一个失败就失败 */
  30. Promise.all = function (promises) {}
  31. /* Promise 函数对象 race() race 赛跑
  32. 返回一个新的 promise 对象,其结果由第一个完成的promise决定 */
  33. Promise.race = function (promises) {}
  34. /*
  35. 返回一个 promise 对象,在指定时间后才确定结果
  36. */
  37. Promise.resolveDelay = function (value, time) {}
  38. /*
  39. 返回一个 promise 对象,在指定时间后才失败
  40. */
  41. Promise.rejectDelay = function (params) {}
  42. // 向外暴露 Promise 函数
  43. window.Promise = Promise
  44. })(window)

Promise构造函数实现

  1. /*
  2. Promise 构造函数
  3. executor:执行器函数(同步执行)
  4. */
  5. function Promise (executor) {
  6. // 将当前promise的对象存储起来
  7. const self = this
  8. self.status = PENDING //状态属性,初始值 pending
  9. self.data = undefined// 存储结果数据的属性
  10. self.callbacks = []// 回调函数数组,
  11. function resolve (value) {
  12. // 如果当前状态不是 pending,直接结果
  13. if (self.status !== PENDING) return
  14. // 改变状态
  15. self.status = RESOLVED
  16. // 保存value
  17. self.data = value
  18. // 如果有等待执行的callback函数,立即异步执行回调函数
  19. if (self.callbacks.length > 0) {
  20. setTimeout(() => { // 放入回调队列汇总执行所有成功的回调函数
  21. self.callbacks.forEach(callback => {
  22. callback.onResolved(value)
  23. })
  24. });
  25. }
  26. }
  27. function reject (reason) {
  28. // 如果当前状态不是 pending,直接结果
  29. if (self.status !== PENDING) return
  30. // 改变状态
  31. self.status = REJECTED
  32. // 保存value
  33. self.data = reason
  34. // 如果有等待执行的callback函数,立即异步执行回调函数
  35. if (self.callbacks.length > 0) {
  36. setTimeout(() => { // 放入回调队列汇总执行所有成功的回调函数
  37. self.callbacks.forEach(callback => {
  38. callback.onRejected(reason)
  39. })
  40. });
  41. }
  42. }
  43. /* 传入一个执行器函数,立即执行*/
  44. try {
  45. executor(resolve, reject)
  46. } catch (error) {
  47. reject(error)
  48. }
  49. }

Promise.then()/catch()的实现

  1. /*
  2. Promise 原型对象的 then()
  3. 返回一个新的 promise 对象
  4. 返回的 promise 的结果由 onResolved/onRejected 执行的结果决定
  5. */
  6. Promise.prototype.then = function (onResolved, onRejected) {
  7. // 因为没有 this 导致 this 指向错误,所以在定义 prototype 方法上一定记得不要使用箭头函数
  8. const self = this
  9. // 向后传递成功的 value
  10. onResolved = typeof onResolved === 'function' ? onResolved : value => value
  11. // 指定默认的失败回调,实现错误/异常穿透的关键点,向后传递失败的 reason
  12. onRejected = typeof onRejected === 'function' ?
  13. onRejected : reason => { throw reason }
  14. return new Promise((resolve, reject) => {
  15. const handle = (callback) => {
  16. /*
  17. 1. 抛出异常
  18. 2. 返回 promise ,返回 promise 的结果就是当前执行回调函数的结果
  19. 3. 返回不是 promise ,返回 promise 成功,value 为返回值
  20. */
  21. try {
  22. const result = callback(self.data)
  23. if (result instanceof Promise) {
  24. result.then(resolve, reject)
  25. } else {
  26. resolve(result)
  27. }
  28. } catch (error) {
  29. reject(error)
  30. }
  31. }
  32. // 当前 promise(then) 的状态时 resolved
  33. if (self.status === RESOLVED) {
  34. // 异步执行回调函数
  35. setTimeout(() => {
  36. handle(onResolved)
  37. });
  38. }
  39. // 当前 promise(then) 的状态时 rejected
  40. if (self.status === REJECTED) {
  41. // 异步执行回调函数
  42. setTimeout(() => {
  43. handle(onRejected)
  44. });
  45. }
  46. // 当前 promise(then) 的状态时 pending
  47. if (self.status === PENDING) {
  48. // 将成功或失败的回调函数保存在 callbacks 数组中
  49. self.callbacks.push({
  50. onResolved: () => {
  51. handle(onResolved)
  52. },
  53. onRejected: () => {
  54. handle(onRejected)
  55. }
  56. })
  57. }
  58. })
  59. }
  60. /* Promise 原型对象的 catch()
  61. 返回一个新的 promise 对象*/
  62. Promise.prototype.catch = function (onRejected) {
  63. return this.then(undefined, onRejected)
  64. }

Promise.resolve()/reject()的实现

  1. /* Promise 函数对象 resolve() */
  2. Promise.resolve = function (value) {
  3. // 返回一个 promise
  4. return new Promise((resolve, reject) => {
  5. /* 判断 value 情况
  6. 1. value === promise
  7. 2. value != promise
  8. */
  9. if (value instanceof Promise) {
  10. // 根据 value 结果,作为当前 promise 的结果
  11. value.then(resolve, reject)
  12. } else { // promsie => 成功,数据是 value
  13. resolve(value)
  14. }
  15. })
  16. }
  17. /* Promise 函数对象 reject() */
  18. Promise.reject = function (reason) {
  19. // 返回一个失败的 promise
  20. return new Promise((resolve, reject) => {
  21. reject(reason)
  22. })
  23. }

Promise.all()/race()的实现

  1. /* Promise 函数对象 all()
  2. 返回一个新的 promise 对象,只有当所有promise成功才成功,有一个失败就失败 */
  3. Promise.all = function (promises) {
  4. // 保存所有成功 value 的数组
  5. // const values = []
  6. const values = new Array(promises.length)
  7. // 计数器,保存成功 promise 的数量
  8. let resolvedCount = 0
  9. return new Promise((resolve, reject) => {
  10. // 遍历获取每个 promise 的结果
  11. promises.forEach((p, index) => {
  12. // Promise.resolve(p) 处理数组不是 promise 对象的情况
  13. Promise.resolve(p).then(
  14. value => {
  15. resolvedCount++
  16. // p 成功,将成功的 value 保存在 values
  17. values[index] = value
  18. // 如果全部成功,将 return 的 promise 改变成功
  19. if (resolvedCount === promises.length) {
  20. resolve(values)
  21. }
  22. },
  23. reason => {
  24. reject(reason)
  25. })
  26. })
  27. })
  28. }
  29. /* Promise 函数对象 race() race 赛跑
  30. 返回一个新的 promise 对象,其结果由第一个完成的promise决定 */
  31. Promise.race = function (promises) {
  32. return new Promise((resolve, reject) => {
  33. // 遍历获取每个 promise 的结果
  34. promises.forEach((p, index) => {
  35. Promise.resolve(p).then(
  36. value => {
  37. // 一旦有成功就该改变状态,将 return 变为成功
  38. resolve(value)
  39. },
  40. reason => {
  41. // 一旦有失败就该改变状态,将 return 变为失败
  42. reject(reason)
  43. })
  44. })
  45. })
  46. }

Promise.resolveDelay()/rejectDelay()的实现(自定义添加)

  1. /*
  2. 返回一个 promise 对象,在指定时间后才确定结果
  3. */
  4. Promise.resolveDelay = function (value, time) {
  5. // 返回一个 promise
  6. return new Promise((resolve, reject) => {
  7. setTimeout(() => {
  8. /* 判断 value 情况
  9. 1. value === promise
  10. 2. value != promise
  11. */
  12. if (value instanceof Promise) {
  13. // 根据 value 结果,作为当前 promise 的结果
  14. value.then(resolve, reject)
  15. } else { // promsie => 成功,数据是 value
  16. resolve(value)
  17. }
  18. }, time);
  19. })
  20. }
  21. /*
  22. 返回一个 promise 对象,在指定时间后才失败
  23. */
  24. Promise.rejectDelay = function (params) {
  25. // 返回一个失败的 promise
  26. return new Promise((resolve, reject) => {
  27. setTimeout(() => {
  28. reject(reason)
  29. }, time);
  30. })
  31. }

class 版本

  1. const PENDING = 'pending'
  2. const RESOLVED = 'resolved'
  3. const REJECTED = 'rejected'
  4. class Promise {
  5. /*
  6. Promise 构造构造器
  7. executor:执行器函数(同步执行)
  8. */
  9. constructor(executor) {
  10. // 将当前promise的对象存储起来
  11. const self = this
  12. self.status = PENDING //状态属性,初始值 pending
  13. self.data = undefined// 存储结果数据的属性
  14. self.callbacks = []// 回调函数数组,
  15. function resolve (value) {
  16. // 如果当前状态不是 pending,直接结果
  17. if (self.status !== PENDING) return
  18. // 改变状态
  19. self.status = RESOLVED
  20. // 保存value
  21. self.data = value
  22. // 如果有等待执行的callback函数,立即异步执行回调函数
  23. if (self.callbacks.length > 0) {
  24. setTimeout(() => { // 放入回调队列汇总执行所有成功的回调函数
  25. self.callbacks.forEach(callback => {
  26. callback.onResolved(value)
  27. })
  28. });
  29. }
  30. }
  31. function reject (reason) {
  32. // 如果当前状态不是 pending,直接结果
  33. if (self.status !== PENDING) return
  34. // 改变状态
  35. self.status = REJECTED
  36. // 保存value
  37. self.data = reason
  38. // 如果有等待执行的callback函数,立即异步执行回调函数
  39. if (self.callbacks.length > 0) {
  40. setTimeout(() => { // 放入回调队列汇总执行所有成功的回调函数
  41. self.callbacks.forEach(callback => {
  42. callback.onRejected(reason)
  43. })
  44. });
  45. }
  46. }
  47. /* 传入一个执行器函数,立即执行*/
  48. try {
  49. executor(resolve, reject)
  50. } catch (error) {
  51. reject(error)
  52. }
  53. }
  54. /*
  55. Promise 原型对象的 then()
  56. 返回一个新的 promise 对象
  57. 返回的 promise 的结果由 onResolved/onRejected 执行的结果决定
  58. */
  59. then (onResolved, onRejected) {
  60. // 因为没有 this 导致 this 指向错误,所以在定义 prototype 方法上一定记得不要使用箭头函数
  61. const self = this
  62. // 向后传递成功的 value
  63. onResolved = typeof onResolved === 'function' ? onResolved : value => value
  64. // 指定默认的失败回调,实现错误/异常穿透的关键点,向后传递失败的 reason
  65. onRejected = typeof onRejected === 'function' ?
  66. onRejected : reason => { throw reason }
  67. return new Promise((resolve, reject) => {
  68. const handle = (callback) => {
  69. /*
  70. 1. 抛出异常
  71. 2. 返回 promise ,返回 promise 的结果就是当前执行回调函数的结果
  72. 3. 返回不是 promise ,返回 promise 成功,value 为返回值
  73. */
  74. try {
  75. const result = callback(self.data)
  76. if (result instanceof Promise) {
  77. result.then(resolve, reject)
  78. } else {
  79. resolve(result)
  80. }
  81. } catch (error) {
  82. reject(error)
  83. }
  84. }
  85. // 当前 promise(then) 的状态时 resolved
  86. if (self.status === RESOLVED) {
  87. // 异步执行回调函数
  88. setTimeout(() => {
  89. handle(onResolved)
  90. });
  91. }
  92. // 当前 promise(then) 的状态时 rejected
  93. if (self.status === REJECTED) {
  94. // 异步执行回调函数
  95. setTimeout(() => {
  96. handle(onRejected)
  97. });
  98. }
  99. // 当前 promise(then) 的状态时 pending
  100. if (self.status === PENDING) {
  101. // 将成功或失败的回调函数保存在 callbacks 数组中
  102. self.callbacks.push({
  103. onResolved: () => {
  104. handle(onResolved)
  105. },
  106. onRejected: () => {
  107. handle(onRejected)
  108. }
  109. })
  110. }
  111. })
  112. }
  113. /* Promise 原型对象的 catch()
  114. 返回一个新的 promise 对象*/
  115. catch (onRejected) {
  116. return this.then(undefined, onRejected)
  117. }
  118. /* Promise 函数对象 resolve()
  119. static 定义 class 的静态方法
  120. 不能再累的实例上调用静态方法,而应该通过类本身调用
  121. */
  122. static resolve = function (value) {
  123. // 返回一个 promise
  124. return new Promise((resolve, reject) => {
  125. /* 判断 value 情况
  126. 1. value === promise
  127. 2. value != promise
  128. */
  129. if (value instanceof Promise) {
  130. // 根据 value 结果,作为当前 promise 的结果
  131. value.then(resolve, reject)
  132. } else { // promsie => 成功,数据是 value
  133. resolve(value)
  134. }
  135. })
  136. }
  137. /* Promise 函数对象 reject() */
  138. static reject = function (reason) {
  139. // 返回一个失败的 promise
  140. return new Promise((resolve, reject) => {
  141. reject(reason)
  142. })
  143. }
  144. /* Promise 函数对象 all()
  145. 返回一个新的 promise 对象,只有当所有promise成功才成功,有一个失败就失败 */
  146. static all = function (promises) {
  147. // 保存所有成功 value 的数组
  148. // const values = []
  149. const values = new Array(promises.length)
  150. // 计数器,保存成功 promise 的数量
  151. let resolvedCount = 0
  152. return new Promise((resolve, reject) => {
  153. // 遍历获取每个 promise 的结果
  154. promises.forEach((p, index) => {
  155. // Promise.resolve(p) 处理数组不是 promise 对象的情况
  156. Promise.resolve(p).then(
  157. value => {
  158. resolvedCount++
  159. // p 成功,将成功的 value 保存在 values
  160. values[index] = value
  161. // 如果全部成功,将 return 的 promise 改变成功
  162. if (resolvedCount === promises.length) {
  163. resolve(values)
  164. }
  165. },
  166. reason => {
  167. reject(reason)
  168. })
  169. })
  170. })
  171. }
  172. /* Promise 函数对象 race() race 赛跑
  173. 返回一个新的 promise 对象,其结果由第一个完成的promise决定 */
  174. static race = function (promises) {
  175. return new Promise((resolve, reject) => {
  176. // 遍历获取每个 promise 的结果
  177. promises.forEach((p, index) => {
  178. Promise.resolve(p).then(
  179. value => {
  180. // 一旦有成功就该改变状态,将 return 变为成功
  181. resolve(value)
  182. },
  183. reason => {
  184. // 一旦有失败就该改变状态,将 return 变为失败
  185. reject(reason)
  186. })
  187. })
  188. })
  189. }
  190. /*
  191. 返回一个 promise 对象,在指定时间后才确定结果
  192. */
  193. static resolveDelay = function (value, time) {
  194. // 返回一个 promise
  195. return new Promise((resolve, reject) => {
  196. setTimeout(() => {
  197. /* 判断 value 情况
  198. 1. value === promise
  199. 2. value != promise
  200. */
  201. if (value instanceof Promise) {
  202. // 根据 value 结果,作为当前 promise 的结果
  203. value.then(resolve, reject)
  204. } else { // promsie => 成功,数据是 value
  205. resolve(value)
  206. }
  207. }, time);
  208. })
  209. }
  210. /*
  211. 返回一个 promise 对象,在指定时间后才失败
  212. */
  213. static rejectDelay = function (params) {
  214. // 返回一个失败的 promise
  215. return new Promise((resolve, reject) => {
  216. setTimeout(() => {
  217. reject(reason)
  218. }, time);
  219. })
  220. }
  221. }