js并发队列

150 阅读1分钟

当有大量异步请求时,并发处理异步任务

/*
* 并发执行任务
* @param { Function[] } tasks
* @param { Number } paralleCount 同时可执行的任务数
*/
function paralleTask(tasks, paralleCount = 2) {
    return new Promise((resolve, reject) => {
        if (!tasks.length) {
            resolve();
            return;
        }
        let nextTaskIndex = 0;
        let finishTaskIndex = 0; // 已完成任务数
        function _run() {
            // 运行下一个任务
            const task = tasks[nextTaskIndex];
            nextTaskIndex++;
            task().then(() => {
                finishTaskIndex++;
                if (nextTaskIndex < tasks.length) {
                    // 运行下一个任务
                    _run();
                } else if (finishTaskIndex === tasks.length) {
                    // 任务完成
                    resolve();
                }
            })
        }
        for (let i = 0; i < paralleCount && i < tasks.length; i++) {
            _run();
        }
    })
}
export default paralleTask;

// 使用
const getData = () => {};
const getUserInfo = () => {};
const getList = () => {};
const tasks = [ getData, getUserInfo, getList, ];
paralleTask(tasks, 6).then(() => {
    console.log('任务全部完成');
})