Source: paralleTasks.js

/**
 * @name: 并发队列
 * @param {Function[]} tasks 需要处理的任务队列
 * @param {Number} paralleCount 并发数,默认为2
 * @return {Promise} 返回一个Promise对象
 * @example
 * async function mockAsync1() {
 *      await new Promise((resolve, reject) => {
 *          setTimeout(() => {
 *              resolve();
 *          }, 1000);
 *      });
 *      console.log("paralleTasks111");
 * }
 * async function mockAsync2() {
 *      await new Promise((resolve, reject) => {
 *          setTimeout(() => {
 *              resolve();
 *          }, 1000);
 *      });
 *      console.log("paralleTasks222");
 * }
 * paralleTasks([mockAsync1, mockAsync2], 1).then(() => {
 *      console.log("执行完毕");
 * });
 */
function paralleTasks(tasks, paralleCount = 2) {
    return new Promise((resolve) => {
        if (tasks.length === 0) {
            resolve();
            return;
        }
        let nextIndex = 0; // 记录当前执行的索引
        let finshCount = 0; // 记录已经完成的任务数
        function _run() {
            // 从任务队列中取出一个任务
            const task = tasks[nextIndex];
            nextIndex++;
            // console.log("开始执行任务", task);
            task().then(() => {
                finshCount++;
                // 任务执行完毕,继续执行下一个任务
                if (nextIndex < tasks.length) {
                    _run();
                } else if (finshCount === tasks.length) {
                    // 所有任务执行完毕,返回
                    resolve();
                }
            });
        }
        for (let i = 0; i < paralleCount && i < tasks.length; i++) {
            _run();
        }
    });
}

export default paralleTasks;