前端如何控制并发请求数量?

最近领导给了一个需求——大文件上传,由于文件过大(几百MB),故而采取了分片上传机制,将大文件分割成了多个小分片进行上传;此时出现了这样一个问题:

  1. 浏览器支持并发请求,谷歌浏览器貌似是从59版本开始,支持并发请求数为 6
  2. 大文件共分了100片,待请求资源就有100个,依次排队,它们在一定时间内会占用全部的并发请求数,导致其他请求无法下发。

这时,就需要控制分片上传请求的并发数不能占满 6 个,影响其他请求下发;这个问题可以转化成实现一个并发请求函数concurrencyRequest(urls, maxNum),要求如下:

  • 最大并发数 maxNum = 3;
  • 每当有一个请求返回,就留下一个空位,可以增加新的请求;
  • 所有请求完成后,结果按照urls顺序依次打印出来,返回一个results集合;

需要考虑的特殊情况:

  • urls 的长度为 0results 为空数组;
  • maxNum 大于 urls 的长度,应该取的是 urls 的长度;
  • 需要定义一个 count 计数器来判断是否已全部请求完成;
  • 由于没有考虑请求是否请求成功,所以请求成功或报错都应该把结果保存在 results 集合中;
  • results 中的顺序需和 urls 中的保持一致;
// 并发请求函数
const concurrencyRequest = (urls, maxNum) => {
    return new Promise((resolve) => {
    	// 特殊情况,urls长度为0
        if (urls.length === 0) {
            resolve([]);
            return;
        }
        
        const results = []; 
        let index = 0; // 下一个请求的下标
        let count = 0; // 当前请求完成的数量

        // 发送请求,一个请求结束之后才能进行下一个请求
        async function request() {
            if (index === urls.length) return;
            const i = index; // 保存序号,使results和urls相对应
            const url = urls[index];
            index++;
            console.log(`${i}个 url`, url);
            try {
                const resp = await fetch(url);
                // resp 加入到results
                results[i] = resp;
            } catch (err) {
                // err 加入到results
                results[i] = err;
            } finally {
                count++;
                // 判断是否所有的请求都已完成
                if (count === urls.length) {
                    console.log('完成了所有的请求');
                    resolve(results);
                }
                request();
            }
        }

        // maxNum和urls.length取最小进行调用
        const times = Math.min(maxNum, urls.length);
        for(let i = 0; i < times; i++) {
            request();
        }
    })
}

测试代码

const urls = [];
for (let i = 1; i <= 20; i++) {
    urls.push(`https://jsonplaceholder.typicode.com/todos/${i}`);
}
concurrencyRequest(urls, 3).then(res => {
    console.log(res);
});

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端性能的主要指标包括: 1. 页面加载时间:指用户点击网页链接后到网页完全展示所需的时间。 2. 首屏加载时间:指用户点击网页链接后到网页首屏展示所需的时间。 3. 用户交互响应时间:指用户在网页上进行交互操作后,网页响应用户操作的时间。 4. 页面渲染时间:指浏览器把 HTML、CSS、JavaScript 等转换成用户可视化页面的时间。 目前的前端性能现状有以下几个方面: 1. 移动端网页性能不佳:由于移动设备的硬件性能和网络速度相对较弱,导致移动端网页的性能表现不如 PC 端。 2. 页面过于复杂:随着前端技术的不断发展,页面越来越复杂,导致页面加载速度变慢,同时也使得页面渲染时间变长。 3. 网络延迟:网络延迟是影响前端性能的一个重要因素,尤其是在全球化的情况下,跨国网络连接速度会更慢,导致前端性能下降。 为了提高前端性能,我们可以采取以下措施: 1. 优化页面代码:减少页面的 DOM 元素数量、压缩 CSS、JS 文件等措施来减少页面加载时间和渲染时间。 2. 使用缓存:通过使用缓存技术来减少请求次数,从而提高页面加载速度。 3. 使用 CDN:通过使用 CDN 技术来加速静态资源的访问速度,减少网络延迟。 4. 优化图片:通过压缩图片、使用合适的图片格式、使用懒加载等方式来提高图片加载速度。 5. 优化网络请求:减少网络请求次数,使用并发请求等方式来提高网络请求的效率。 综上所述,前端性能是一个复杂的话题,需要从多个方面入手,采取综合的解决方案,才能够提高前端性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值