编辑代码

function asyncQueue(fn, max = 100) {

    let count = 0;
    const queue = [];

    function run() {
        if (queue.length && count < max) {
            count++;
            const [ curFn, resolve, reject ] = queue.shift();
            return curFn().then(resolve).catch(reject).finally((res) => {
                count--;
                run();
            });
        }
    }

    return function func(...arg) {
        const that = this;
        const p = new Promise((resolve, reject) => {
            queue.push([fn.bind(that, ...arg), resolve, reject]);
        });
        run();
        return p;
    }

}

function queryUser(a) {
    const t = `${new Date().getHours()}:${new Date().getMinutes()}:${new Date().getSeconds()}`;
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(`这是第${a}个循环,在 ${t} 执行,在 ${new Date().getHours()}:${new Date().getMinutes()}:${new Date().getSeconds()} 执行结束`);
        }, Math.random() * 1000);
    });
}

const queryUserFn = asyncQueue(queryUser);

// 最大并发100个
for (let i = 0; i < 1000; i++) {
    queryUserFn(i).then((res) => {
        console.log('this is res: ' + res);
    })
}