15行代码实现一个带并发数限制的fetch请求函数
2019-03-15 21:10
1636 查看
版权声明:本文为本人原创文章,如需转载请附上原文地址。 https://blog.csdn.net/qq_33081841/article/details/88583735
原题
读题
- 批量请求
- 可控制并发度
- 全部请求结束,执行
callback
解题
方案一: 递归
[code]function sendResquest(urls, max, callback) { let urlsCopy = [... urls];//防止影响外部urls变量 function request() { function Handle () { count--; console.log('end 当前并发数为: '+count); if(urlsCopy.length) {//还有未请求的则递归 request(); } else if (count === 0) {//并发数为0则表示全部请求完成 callback() } } count++; console.log('start 当前并发数为: '+count); //请求 fetch(urlsCopy.shift()).then(Handle).catch(Handle); //并发数不足时递归 count < max && request(); } let count = 0;//几率并发数 request(); }
方案二: Promise
[code]function sendResquest(urls, max, callback) { let pending_count = 0, //并发数 idx = 0;//当前请求的位置 while (pending_count < max) { _fetch(urls[idx++]) } async function _fetch(url) { if (!url) return; pending_count++; console.log(url + ':start','并发数: '+pending_count); await fetch(url) pending_count--; console.log(url + ':done','并发数: '+pending_count); _fetch(urls[idx++]); pending_count || callback && callback() } }
全部代码
[code]//递归方式 function handleFetchQueue(urls, max, callback) { let urlsCopy = [... urls];//防止影响外部urls变量 function request() { function Handle () { count--; console.log('end 当前并发数为: '+count); if(urlsCopy.length) {//还有未请求的则递归 request(); } else if (count === 0) {//并发数为0则表示全部请求完成 callback() } } count++; console.log('start 当前并发数为: '+count); //请求 fetch(urlsCopy.shift()).then(Handle).catch(Handle); //并发数不足时递归 count < max && request(); } let count = 0;//几率并发数 request(); } //Promise方式 function sendResquest(urls, max, callback) { let pending_count = 0, //并发数 idx = 0;//当前请求的位置 while (pending_count < max) { _fetch(urls[idx++]) } async function _fetch(url) { if (!url) return; pending_count++; console.log(url + ':start','并发数: '+pending_count); await fetch(url) pending_count--; console.log(url + ':done','并发数: '+pending_count); _fetch(urls[idx++]); pending_count || callback && callback() } } //验证 let urls = Array.from({length: 10}, (v, k) => k); let fetch = function (idx) { return new Promise(resolve => { let timeout = parseInt(Math.random() * 1e4); setTimeout(() => { resolve(idx) }, timeout) }) }; let max = 4; let callback = () => { console.log('run callback'); }; //执行 sendResquest(urls, max, callback)
相关文章推荐
- 定义一个函数,来实现重复代码的简写.
- PHP中利用redis实现消息队列处理高并发请求--简洁代码实现效果
- 这是一个秒杀系统,即大量用户抢有限的商品,先到先得 用户并发访问流量非常大,需要分布式的机器集群处理请求 系统实现使用Java
- asp下实现IP限制函数代码
- 从零实现一个高性能网络爬虫(一)网络请求分析及代码实现
- Clojure:一个请求用户输入函数的实现
- 一个函数5行代码即可实现完整的面向方面AOP编程功能
- 多线程并发请求检测url是否可用,有一个可用停掉所有的线程实现Callable接受线程返回值
- 编写一个函数,实现把C/C++程序代码中的注释去掉,并把结果返回。
- asp下实现IP限制函数代码
- Shiro 控制并发登录人数限制及登录踢出的实现代码
- 使用函数实现一个登陆流程伪代码
- 从零实现一个高性能网络爬虫(一)网络请求分析及代码实现
- 从零实现一个高性能网络爬虫(一)网络请求分析及代码实现
- php 实现一个字符串加密解密的函数实例代码
- 请编写实现malloc()内存分配函数功能一样的代码。给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。
- 1、使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数
- 一个类如何实现两个接口中同名同参数不同返回值的函数
- 实现了一个PHP5的getter/setter基类的代码
- FormatRemoteUrl函数之asp实现格式化成当前网站完整的URL-将相对地址转换为绝对地址的代码