不需要获取结果
const tasks = ['url',...];
class Queue {
constructor(maxConcurrency) {
this.maxConcurrency = maxConcurrency;
this.tasks = [];
this.running = 0;
}
run() {
while (this.running < this.maxConcurrency && this.tasks.length) {
const task = this.tasks.shift();
task().then(() => {
this.running--;
this.run();
});
this.running++;
}
}
enqueue(task) {
this.tasks.push(task);
this.run();
}
}
// 使用示例
const queue = new Queue(3); // 最大并发数为3
for (let i = 0; i < tasks.length; i++) {
queue.enqueue(() => fetch(tasks[i]).then(res=>res.arrayBuffer()));
}
需要获取结果
// 异步任务数组
class Queue {
constructor(limit) {
this.limit = limit
this.tasks = []
this.running = 0
this.results = []
this.allDoneResolver = null; // 用于解决 allDone promise 的函数
this.allDone = new Promise(resolve => { // 当所有任务都完成时解决的 promise
this.allDoneResolver = resolve;
});
}
run() {
while (this.running < this.limit && this.tasks.length) {
const task = this.tasks.shift()
task().then((res) => {
this.running--
this.run()
this.results.push(res)
})
this.running++
}
if (this.running === 0 && this.tasks.length === 0) { // 所有任务都完成
this.allDoneResolver(this.results);
}
}
enqueue(task) {
this.tasks.push(task)
this.run()
}
getResults() {
return this.allDone; // 返回一个 promise,这个 promise 将在所有任务完成时解决,解决值为所有任务的结果
}
}
function promiseLimit(urls, limit) {
return new Promise(resolve => {
// 使用示例
const queue = new Queue(limit); // 最大并发数为5
for (let i = 0; i < urls.length; i++) {
queue.enqueue(() => fetch(urls[i]).then(res => res.json()));
}
// 等待所有任务完成,然后获取结果
queue.getResults().then((results) => {
resolve(results)
});
})
}
let urls = ['https://res.hc-cdn.com/console-ui/1.25.1.20230925154846/hws/schema.json', 'https://res.hc-cdn.com/console-ui/1.25.1.20230925154846/hws/schema.json', 'https://res.hc-cdn.com/console-ui/1.25.1.20230925154846/hws/schema.json', 'https://res.hc-cdn.com/console-ui/1.25.1.20230925154846/hws/schema.json', 'https://res.hc-cdn.com/console-ui/1.25.1.20230925154846/hws/schema.json', 'https://res.hc-cdn.com/console-ui/1.25.1.20230925154846/hws/schema.json', 'https://res.hc-cdn.com/console-ui/1.25.1.20230925154846/hws/schema.json', 'https://res.hc-cdn.com/console-ui/1.25.1.20230925154846/hws/schema.json'];
promiseLimit(urls, 3).then(resList => console.log(resList));
// 并发量限制