JavaScript 使用递归异步的请求
JavaScript 使用递归异步的请求
场景
之前写了个 user.js
脚本来抓取百度网盘的文件元信息列表,用来进行二级查看和分析,脚本放到了 GreasyFork。最开始为了简化代码直接使用了 async/await
单线程进行异步请求,导致请求的速度十分不理想!
关键代码如下
1 | /** |
可以看到,使用的方式是 递归 + 单异步
,这就导致了脚本的效率不高,使用体验很差!
解决
吾辈想要使用多异步模式,需要解决的问题有二:
- 如何知道现在有多个异步在执行并且在数量过多时等待
- 如何知道所有的请求都执行完成了然后结束
解决思路
- 判断并限定异步的数量
- 添加记录正在执行的异步请求的计数器
execQueue
- 每次请求前先检查
execQueue
是否到达限定值- 如果没有,
execQueue + 1
- 如果有,等待
execQueue
减小
- 如果没有,
- 执行请求,请求结束
execQueue - 1
- 添加记录正在执行的异步请求的计数器
- 判断所有请求都执行完成
- 添加记录正在等待的异步请求的计数器
waitQueue
- 在判断
execQueue
是否到达限定值之前waitQueue + 1
- 在判断
execQueue
是否到达限定值之后(等待之后)waitQueue - 1
- 请求结束后判断
waitQueue
和waitQueue
是否均为0
- 是:返回结果
- 否:什么都不做
- 添加记录正在等待的异步请求的计数器
具体实现如下
1 | /** |
吾辈使用 timing
函数测试了一下
1 | /** |
请求了 2028
次,两个函数的性能比较如下(单位是毫秒)
asyncList
:109858.80000004545syncList
:451904.3000000529
差距近 4.5 倍,几乎等同于默认的异步倍数了,看起来优化还是很值得呢!
附:其实
asyncList
如果使用单异步的话效率反而更低,因为要做一些额外的判断导致单次请求更慢,但因为多个异步请求同时执行的缘故因此缺点被弥补了
那么,关于 JavaScript 使用递归异步的请求就到这里啦