js实现多个异步任务的串行和并行执行(add/sum)

复制代码
// add 异步相加
function add(a, b) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(a + b);
        }, 1000);
    });
}
// 传入不定长度的数组,与 add 函数,对数组的每个值进行相加,串行相加
function sum(arr, add) {
    // 因为 add 函数返回的结果为 Promise,所以这里要给一个 Promise.resolve()的初始值,如果没有返回结果则给 0
    // 这里的每个 p,c 都是 promise 返回结果
    return arr.reduce((p, c) => {
        return p.then((acc) => {
            if (!acc) {
                acc = 0;
            }
            return add(acc, c);
        });
    }, Promise.resolve());
}
// console.log(await add(1, 2));
console.log(
    sum([1, 2, 3, 4, 5], add).then((res) => {
        console.log(res); // 15
    })
);
// 使用 Promise.all 来实现读个任务并行执行,每个任务执行一部分,传入concurrency 代表将数组以几个分一组,剩余不够的成一组
function sumPoll(arr, add, concurrency = Infinity) {
    const chunks = []; // 得到分组之后的数组
    const len = arr.length <= concurrency ? arr.length : concurrency;
    while (arr.length) {
        chunks.push(arr.splice(0, len));
    }
    // console.log("chunks", chunks);
    // 分组之后每一组算一个异步任务开始执行,tasks 为异步任务列表
    const tasks = [];
    for (const chunk of chunks) {
        // 每一个 task 中的数组单独进行计算
        tasks.push(
            chunk.reduce(
                (p, c) =>
                    p.then((acc) => {
                        if (!acc) acc = 0;
                        // console.log("acc", acc);
                        // console.log("c", c);
                        return add(acc, c);
                    }),
                Promise.resolve()
            )
        );
    }
    // 使用 Promise.all
    return Promise.all(tasks).then((result) => {
        console.log("result", result);
        // 得到返回的计算结果的数组
        if (result.length === 1) {
            return result[0];
        }
        // 将计算结果的数组再次传入sumPoll 进行计算
        return sumPoll(result, add, concurrency);
    });
}

sumPoll([1, 2, 3, 4, 5, 6, 7, 8, 9, , 10], add, 3).then((result) =>
    console.log(result)
);
复制代码

参考代码:https://github.com/shfshanyue/Daily-Question/issues/662#issuecomment-885993395

 

关注我,好多内推机会。

 

posted @   蓓蕾心晴  阅读(659)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
历史上的今天:
2018-08-23 如何把大段文字转为带html标签的文字
点击右上角即可分享
微信分享提示