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);
for (let i = 0; i < 1000; i++) {
queryUserFn(i).then((res) => {
console.log('this is res: ' + res);
})
}