JavaScript 自定义限流队列 fetch
JavaScript 自定义限流队列 fetch
为什么需要它?
有些时候不得不需要限制并发 fetch 的请求数量,避免请求过快导致 IP 封禁
需要做到什么?
- 允许限制 fetch 请求同时存在的数量
- 时间过久便认为是超时了
如何实现?
暂停请求
该方法的请求是无序的!
- 使用 class 定义默认超时设置和请求数量限制的构造函数
- 在请求前判断当前请求的数量,添加请求等待数量
- 如果请求数量已满,则进行等待
- 如果请求数量未满,则删除一个请求等待数量
- 请求完成,删除当前请求数量
等待队列:循环监听
该方法需要使用回调函数
- 使用 class 定义默认超时设置和请求数量限制的构造函数
- 在请求前将请求 argments 添加到等待队列中
- 使用
setInterval
函数持续监听队列和当前执行的请求数- 发现请求数量没有到达最大值,且等待队列中还有值,那么就执行一次请求
等待队列:触发钩子
- 使用 class 定义默认超时设置和请求数量限制的构造函数
- 在请求前将请求 argments 添加到等待队列中
- 添加完成,等待当前请求数量未满
- 尝试启动等待队列(钩子)
实现代码
暂停请求实现
1 | /** |
使用示例
1 | const requestLimiting = new RequestLimiting({ timeout: 500, limit: 1 }) |
等待队列:循环监听实现
1 | /** |
使用示例
1 | const requestLimiting = new RequestLimiting({ timeout: 500, limit: 1 }) |
等待队列:触发钩子实现
1 | /** |
使用示例
1 | const requestLimiting = new RequestLimiting({ timeout: 500, limit: 1 }) |
总结
目前而言,最后一种实现是最好的,同时实现了两种规范
- 返回
Promise
,避免使用回调函数 - 请求执行与添加顺序相同