当前位置:   article > 正文

使用Promise.any处理前端高并发问题_前端需要考虑高并发吗

前端需要考虑高并发吗

使用Promise.any处理前端请求高并发之前,首先要弄清楚Promise几个函数的关系;

Promise.all(): 全部子实例(promise对象)成功才算成功,一个子实例失败就算失败

Promise.any(): 有一个子实例(promise对象)成功就算成功,全部子实例失败才算失败

Promise.race(): race是竞赛的意思,即看最先的promise子实例是成功还是失败,则它就与最先的子实例状态相同。

Promise.allSettled(): 所有子实例状态都返回结果,不管子实例是成功还是失败,包装实例才执行,不过状态总是变成成功 。

  1. class PromisePool{
  2. constructor(limit, callback){
  3. this.limit = limit; // limit为每次的并发量
  4. this.pool = []; //初始化并发池
  5. this.callback = callback; //所有任务执行完的回调
  6. this.urls = []; //urls地址为所有的请求地址数组
  7. }
  8. start(urls){
  9. console.time('计时')
  10. // 首次初始化并发池
  11. this.urls = urls;
  12. let len = Math.min(this.urls.length, this.limit);
  13. let initUrl = this.urls.splice(0, len); //切割之后urls还剩len之后的部分
  14. if (initUrl.length > 0) {
  15. // 首次把线程池塞满
  16. for (let i = 0; i < initUrl.length; i++) {
  17. this.runTask(initUrl[i])
  18. }
  19. }
  20. }
  21. // 再次往线程池添加任务
  22. raceTask(race){
  23. race.then(res => {
  24. if (this.urls.length > 0) {
  25. let url = this.urls.shift();
  26. // 一有一个任务完成,就再塞下一个
  27. this.runTask(url);
  28. }
  29. });
  30. }
  31. runTask(url){
  32. let task = this.mockFetch(url);
  33. // this.pool里面的是promise任务数组
  34. if(this.pool.length < this.limit) {
  35. this.pool.push(task)
  36. }
  37. console.log(this.pool)
  38. // 利用promise.any方法获取某个任务完成的信号
  39. let race = Promise.any(this.pool);
  40. // 每个请求结束后,将该promise请求从并发池移除
  41. // 成功和失败都要执行移除和往并发池添加的动作
  42. task.then((res) => {
  43. // console.log('成功:',res);
  44. this.pool = this.pool.filter((ele) => ele != task);
  45. this.raceTask(race);
  46. if (this.pool.length === 0) {
  47. this.callback('执行完了');
  48. console.timeEnd('计时')
  49. }
  50. }).catch((err) => {
  51. // console.log('错误:',err)
  52. this.pool = this.pool.filter((ele) => ele != task);
  53. this.raceTask(race);
  54. if (this.pool.length === 0) {
  55. this.callback('执行完了');
  56. console.timeEnd('计时')
  57. }
  58. })
  59. }
  60. // 模拟ajax请求
  61. mockFetch(param){
  62. return new Promise((resolve, reject) => {
  63. setTimeout(() => {
  64. if(param.info !== '2'){
  65. resolve(param);
  66. } else{
  67. reject(param);
  68. }
  69. }, 2000);
  70. })
  71. }
  72. }
  73. const pool = new PromisePool(5, (res) => {
  74. console.log(res)
  75. });
  76. const urls = [{
  77. info: '1',
  78. time: 2000
  79. },
  80. {
  81. info: '2',
  82. time: 1000
  83. },
  84. {
  85. info: '3',
  86. time: 2000
  87. },
  88. {
  89. info: '4',
  90. time: 2000
  91. },
  92. {
  93. info: '5',
  94. time: 3000
  95. },
  96. {
  97. info: '6',
  98. time: 1000
  99. },
  100. {
  101. info: '7',
  102. time: 2000
  103. },
  104. {
  105. info: '8',
  106. time: 2000
  107. },
  108. {
  109. info: '9',
  110. time: 3000
  111. },
  112. {
  113. info: '10',
  114. time: 1000
  115. },
  116. {
  117. info: '11',
  118. time: 1000
  119. },
  120. {
  121. info: '12',
  122. time: 2000
  123. },
  124. {
  125. info: '13',
  126. time: 2000
  127. },
  128. {
  129. info: '14',
  130. time: 3000
  131. },
  132. {
  133. info: '15',
  134. time: 1000
  135. },
  136. {
  137. info: '16',
  138. time: 1000
  139. },
  140. {
  141. info: '17',
  142. time: 2000
  143. },
  144. {
  145. info: '18',
  146. time: 2000
  147. },
  148. {
  149. info: '19',
  150. time: 3000
  151. },
  152. {
  153. info: '20',
  154. time: 1000
  155. }
  156. ]
  157. pool.start(urls);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/330171
推荐阅读
相关标签
  

闽ICP备14008679号