leetcode 题库
https://github.com/sl1673495/leetcode-javascript/issues
请求并发控制
ts
/**
* 请求并发控制
* @template P 请求参数
* @template R 响应类型
* @param request 请求函数
* @param maxNum 最大并发数
*/
function withMaxConcurrency<P extends any[], R>(request: (...args: P) => Promise<R>, maxNum = 5) {
const queue = new Map<() => Promise<void>, Promise<void> | null>();
/**用未发送的请求替代已完成的请求 */
function replace(oldSend: () => Promise<void>) {
queue.delete(oldSend);
for (const [send, promise] of queue) {
if (promise === null) {
queue.set(send, send());
break;
}
}
}
return function (...args: P) {
const { promise, resolve, reject } = Promise.withResolvers<R>();
const sendRequest = () =>
request(...args)
.then(resolve, reject)
.finally(() => replace(sendRequest));
queue.set(sendRequest, queue.size < maxNum ? sendRequest() : null);
return promise;
};
}