全栈的自我修养 ———— js如何处理并发的大量请求??

假如一个事件段内传过来一百多个请求,我们该处理大量并发请求呢

过程实现

复制代码
定义一个方法,这个方法会放入你在这个时间段接收到的请求,这里100位例!
js 复制代码
        const urlArr = []
        function distributeUrl(params) {
            for(let i = 0;i< params;i++){
                urlArr.push(`http://localhost:8080/text`)
            }
        }
        distributeUrl(100)
        
复制代码
声明一个处理请求的方法,接受一个事件段里面的请求数组
然后sum就是你允许的最大并发量
js 复制代码
        function handleTask(urlArr,sum){
            return new Promise((resolve) => {
            // 如果这个时间段数组为零就返回
                if (urlArr.length === 0){
                    resolve()
                }
                const resArr = [];
                let index = 0;
                
                async function request(){
                // 在此期间为了提高效率,我们还可以分给多个服务器 
                // 如果完成了就返回
                    if (index >= urlArr.length){
                        return
                    }
                    const nowIndex = index
                    const url = urlArr[index]
                    index++
                    // 如下可以返回这个请求数组里面的每一个请求的请求结果
                 	// 然后汇聚到一个resArr上
                 	// 一次循环后继续进行下次循环
                    try {
                        const res = await fetch(url)
                        resArr[nowIndex] = res.status
                    } catch (error) {
                        console.log(error);
                        resArr[nowIndex] = '错误'
                    } finally {
                        console.log(resArr);
                        request()
                    }
                }
                for (let i = 0; i < sum; i++) {
                    request()
                }
            })
        }

验证

假如现在允许的并发量为4,有一百个请求!

假如现在允许的并发量为1,有一百个请求!

源码

js 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        const urlArr = []
        function distributeUrl(params) {
            for(let i = 0;i< params;i++){
                urlArr.push(`http://localhost:8080/text`)
            }
        }
        distributeUrl(100)
        
        function handleTask(urlArr,sum){
            return new Promise((resolve) => {
                if (urlArr.length === 0){
                    resolve()
                }
                const resArr = [];
                let index = 0;
                async function request(){
                    if (index >= urlArr.length){
                        return
                    }
                    const nowIndex = index
                    const url = urlArr[index]
                    index++
                    try {
                        const res = await fetch(url)
                        resArr[nowIndex] = res.status
                    } catch (error) {
                        console.log(error);
                        resArr[nowIndex] = '错误'
                    } finally {
                        console.log(resArr);
                        request()
                    }
                }
                for (let i = 0; i < sum; i++) {
                    request()
                }
            })
        }
        // 第一个参数传递地址数组,第二个参数最大并发数
        handleTask(urlArr,4)
    </script>
</body>
</html>
相关推荐
QX_hao2 小时前
【Go】--反射(reflect)的使用
开发语言·后端·golang
inferno2 小时前
Maven基础(二)
java·开发语言·maven
我是李武涯2 小时前
从`std::mutex`到`std::lock_guard`与`std::unique_lock`的演进之路
开发语言·c++
史不了3 小时前
静态交叉编译rust程序
开发语言·后端·rust
读研的武3 小时前
DashGo零基础入门 纯Python的管理系统搭建
开发语言·python
Andy4 小时前
Python基础语法4
开发语言·python
但要及时清醒4 小时前
ArrayList和LinkedList
java·开发语言
孚亭4 小时前
Swift添加字体到项目中
开发语言·ios·swift
hweiyu004 小时前
Go、DevOps运维开发实战(视频教程)
开发语言·golang·运维开发