JS任务队列限制并发数shiftPromiseresolverejectthencatchfinallythrow constructorsetTimeoutMathmin

Posted web半晨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS任务队列限制并发数shiftPromiseresolverejectthencatchfinallythrow constructorsetTimeoutMathmin相关的知识,希望对你有一定的参考价值。

目录


1、场景

在前端页面中需要同时发送20个请求,但是服务端有限制,需要前端控制并发数,保证最多只能同时发送5个请求。


2、需求

1、最多同时执行的任务数为10个
2、当前任务执行完成后,释放队列空间,自动执行下一个任务
3、所有任务添加到任务队列后,自动开始执行任务


3、代码实现

// 请求函数
function createTask(i) 
	return () => 
		return new Promise((resolve, reject) => 
			setTimeout(() => 
				resolve(i);
			, 2000);
		);
	;


class TaskQueue 
	constructor() 
		this.max = 5;
		this.taskList = [];
		setTimeout(() => 
			this.run();
		);
	
	addTask(task) 
		this.taskList.push(task);
	
	run() 
		let len = this.taskList.length;
		
		if (!len) return false;
		
		let min = Math.min(this.max, len);
		for (let i = 0; i < min; i++) 
			// 开始占用一个任务的空间
			this.max--;
			let task = this.taskList.shift();
			task().then((res => 
				console.log('result:', res);
			)).catch(error => 
				throw new Error(error);
			).finally(() => 
				// 释放一个任务空间
				this.max++;
				this.run();
			);
		
	


const taskQueue = new TaskQueue();
for (let i = 0; i < 20; i++) 
	const task = createTask(i + 1);
	taskQueue.addTask(task);

以上是关于JS任务队列限制并发数shiftPromiseresolverejectthencatchfinallythrow constructorsetTimeoutMathmin的主要内容,如果未能解决你的问题,请参考以下文章

用go写爬虫服务并发请求,限制并发数

限制 Azure Functions 队列上的并发作业数

限制给定任务定义的并发 Fargate 任务数

AFNetworking 2:限制并发下载任务的最大数量

iOS(Swift) TaskProtocol异步任务队列

WIN7的IIS对并发连接数有限制么