手写系列之串行Promise执行 - 图1


本文主要是介绍了如何串行执行promise,其实这种编程方式还有很多案例,例如:红绿灯,js控制图片加载…

1. 直接上代码

  1. // 1. 利用高阶函数来执行生成不同时期完成的promise
  2. const makePromise = (time, num) => {
  3. return () => {
  4. return new Promise((resolve) => {
  5. setTimeout(() => {
  6. console.log(`第${num}张图片下载完成...`)
  7. resolve()
  8. }, time)
  9. })
  10. }
  11. }
  12. // 2. 返回一个数组函数,函数的返回值都是一个promise
  13. const allPromise = [1, 2, 3].map((item) => makePromise(item * 1000, item))
  14. // 3. 利用promise来将每个promise合并
  15. const sum = allPromise.reduce((pre, cur) => {
  16. // 3.1 最外层的promise状态,将promise进行串链,这个promise完成取决于下个promise完成
  17. return pre.then(() => {
  18. // 3.2 返回一个新的promise表示状态
  19. return new Promise((resolve) => {
  20. // 3.3 最里面的promise控制什么时候执行完成,函数会返回一个promise
  21. cur().then(() => {
  22. resolve()
  23. })
  24. })
  25. })
  26. }, Promise.resolve())
  27. sum.then(() => {
  28. console.log('完成了...')
  29. })

2. 解释

其实看上述的代码注释已经很清楚了,这种会把重点解释下

  • 首先利用数组函数reduce将每个元素进行串联
  • 最外层的返回是否成功,取决于内存的promise是否执行结束
  • 返回一个全新的prmise,这个Promise用来控制串行的promise是否执行成功
  • 如果串行的Promise执行成功,告知上述全新的promise成功了