• 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

     

    关注我,好多内推机会。

  • 相关阅读:
    OpenFileMapping
    findwindow
    CopyMemory
    SetWindowsHookEx
    fillchar
    什么是ashx文件
    WPF中的控件
    WPF X名称空间里都有什么
    XAML语法学习之...
    Repeater控件使用总结
  • 原文地址:https://www.cnblogs.com/beileixinqing/p/16617066.html
Copyright © 2020-2023  润新知