首页前端工具函数封装并发请求处理函数

封装并发请求处理函数

分类前端工具函数时间2023-09-13 15:28:27发布RustStream浏览126
摘要:代码解释 定义了一个函数 concurRequest,用于并发请求多个 URL 并返回它们的响应结果。 实现代码 /** * 并发函数 * @param data 传入的请求数组 [url, url, url] * @param maxnum 同时发起请求的数量,默认为3 */ function concurRequest(data, maxnum = 3 { if(data.length === 0 { return Promise.resolve([] ; } // 返回一个Promise return new Promise((resolve =...

代码解释

定义了一个函数 concurRequest,用于并发请求多个 URL 并返回它们的响应结果。

实现代码

/**
 * 并发函数
 * @param data 传入的请求数组 [url, url, url]
 * @param maxnum 同时发起请求的数量,默认为3
 */

function concurRequest(data, maxnum = 3){
    if(data.length === 0){
        return Promise.resolve([]);
    }
    // 返回一个Promise
    return new Promise((resolve) => {
        let nextIndex = 0;   // 下一个请求索引
        let result = [];  // 存储返回数据,并与请求一一对应返回
        let finishCount = 0;  // 记录完成请求的个数,全部完成及返回Promise结果
        // 声明一个辅助函数
        async function _request(){
            // 处理一下边界问题
            if(nextIndex >= data.length){
                return;
            }
            let i = nextIndex; // 用于记录当前请求是 data 数据中的哪一项,用于处理返回数据对应在result中的位置
            const url = data[nextIndex++]; // 从data数据中拿取数据,并让下标自增
            const res= (await fetch(url, { method: 'GET' })).json();
            result[i] = res;
            finishCount++;
            // 判断是否已经全部请求完成
            if(finishCount === data.length){
                resolve(result)
            }
            _request() // 递归调用,开启下一次请求
        }
        for (let i = 0; i < Math.min(maxnum, data.length); i++) {
            _request()            
        }
    }, 
    (reject) => {
        throw new Error(reject)
    })
}

简单使用

let arr = new Array(25).fill(0).map((_,i) => `/api?id=${i}`)

const handleClick = async () => {
    const data = await concurRequest(arr)
    console.log(data) // 
}

后端服务器测试

const http = require('http')
const url = require('url')

const server = http.createServer((req, res) => {
    const { query } = url.parse(req.url, true)

    res.setHeader('Content-Type', 'application/json; charset=utf-8')
        res.writeHead(200, { 'Content-Type': 'application/json' })
        res.end(JSON.stringify({code: 200, msg: `请求成功!请求数据ID为${query?.id}`}))
    
})


server.listen('9000', () => {
    console.log('Server is running at http://localhost:9000')
})

效果展示

null

数据请求结果展示

请求结果展示

本文链接:https://blog.smallhao.fun/?id=3 转载需授权!

分享到:

Chen’Blog版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

JavaScript
前端深拷贝 Data Url用法

游客 回复需填写必要信息
召唤伊斯特瓦尔