前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >前端异步请求并发限流

前端异步请求并发限流

作者头像
蓓蕾心晴
发布2022-08-03 19:04:45
6340
发布2022-08-03 19:04:45
举报
文章被收录于专栏:前端小叙前端小叙

一道前端经典面试题,前端异步请求并发限流,主要需求是:一次最多有 max 个请求发出,如果有超出的请求待有请求响应完成后再开始继续请求,始终保持仅有 max 个,假设 max=10个,代码如下:

主要原理为:令牌桶原理

代码语言:javascript
复制
// 原理,使用令牌桶
// 指 一次允许同时发出 max 个请求,这max个请求按执行时间返回具体结果,这 max 个有一个返回结果后,再开始执行一个
// 创建一个异步执行任务
function createTask(i) {
    return () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(i);
            }, i * 100);
        });
    };
}
// 任务队列类
class TaskQueue {
    constructor(max) {
        this.max = max || 10; // 当前可执行的任务数
        this.taskList = []; // 当前需要执行的任务列表
    }
    // 添加任务
    addTask(task) {
        this.taskList.push(task);
    }
    // 开始任务
    startTask() {
        setTimeout(() => {
            this.run();
        }, 0);
    }
    // 执行任务
    run() {
        console.log("this.max", this.max);
        const length = this.taskList.length;
        // 如果当前没有任务需要执行,则直接退出
        if (!length) {
            return;
        }
        // 取当前可执行的任务数与当前还剩的任务数的最小值,避免没任务执行但是还进行遍历的浪费
        const min = Math.min(this.max, length);
        // 遍历当前可执行的任务数
        for (let i = 0; i < min; i++) {
            // 开始占用一个任务空间,所以可执行的总任务数要减一
            this.max--;
            // 获取任务列表中的第一个任务,并将第一个任务从列表中删除
            const task = this.taskList.shift();
            // 以下为异步请求
            task()
                .then((res) => {
                    console.log(res);
                })
                .catch((err) => {
                    console.log(err);
                })
                .finally(() => {
                    // 释放一个任务空间,所以可执行的总任务数要加一
                    this.max++;
                    // 一个请求执行结束,则释放出一个可执行的任务空间,继续调用 run 方法,遍历可执行的任务数,执行其他任务
                    this.run();
                });
        }
    }
}

const taskQueue = new TaskQueue();

for (let i = 0; i < 32; i++) {
    const task = createTask(i);
    taskQueue.addTask(task);
}
taskQueue.startTask();

代码参考链接:https://www.bilibili.com/video/BV1XZ4y1y7BX?spm_id_from=333.337.search-card.all.click

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档