上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖
楼主: empyrealtear - 

分享一个简易的异步线程池,套娃式异步请求可用

[复制链接]
  • TA的每日心情
    慵懒
    5 天前
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    2

    主题

    3

    回帖

    78

    积分

    初级工程师

    积分
    78
    发表于 6 天前 | 显示全部楼层 | 阅读模式

    本帖最后由 empyrealtear 于 2025-1-12 21:57 编辑

    简易异步线程池

    1. 参考文献

    2. 修改后代码

    const asyncPool = async (arr, process = (item, arr) => item, begin = (v) => v, end = (v) => v,
        poolLimit = 10, percentComplete = (pct) => pct) => {
        let ret = []
        let executing = new Set()
        let arr_res = new Array(arr.length)
        let completeCount = 0
        // begin
        percentComplete(completeCount / arr.length * 100)
        arr = begin(arr)
        // process
        for (let [index, item] of arr.entries()) {
            var p = Promise.resolve().then(async () => {
                try {
                    let res = await process(item, arr)
                    arr_res[index] = res
                } catch (err) {
                    console.warn(err)
                    arr_res[index] = err
                }
                return
            }).finally(() => {
                percentComplete((++completeCount) / arr.length * 100)
            })
            ret.push(p)
            executing.add(p)
            let clean = () => executing.delete(p)
            p.then(clean).catch(clean)
            if (executing.size >= poolLimit) {
                await Promise.race(executing)
            }
        }
        // end
        return Promise.all(ret).then(() => {
            percentComplete(completeCount / arr.length * 100)
            return end(arr_res)
        })
    }

    3. 使用样例

    fetch(url).then(async (xhr) => {
        let data = xhr.response?.data
        if (data) {
            return await asyncPool(data, async (v, arr) => {
                let row = {}
                await fetch(v.url).then((xhr2) => {
                    let data2 = xhr2.response?.data
                    row = { value: data2 }
                })
                return row
            })
        }
    })

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表