Может такой вариант
const sendRequests = (requests, maxRequestsCount) => {
return new Promise(resolve => {
const responses = Array.from({length: requests.length}, _ => null);
let curUrlInd = 0;
let requestDone = 0;
for (let i = 0; i < maxRequestsCount; i++) {
makeRequest(requests[i], i);
}
curUrlInd = maxRequestsCount;
function makeRequest(url, n) {
return fetch(url)
.then(result => result.json())
.catch(error => error)
.then(result => {
responses[n] = result;
})
.finally (() => {
if (curUrlInd < requests.length) {
makeRequest(requests[curUrlInd], curUrlInd);
curUrlInd++;
}
requestDone ++;
if (requestDone === requests.length) {
resolve(responses);
}
});
}
});
}
console.log(
sendRequests([
'https://jsonplaceholder.typicode.com/todos/2',
'https://jsonplaceholder.typicode.com/todos/4',
'https://jsonplaceholder.typicode.com/todos/10',
'https://jsonplaceholder.typicode.com/todos/18'
], 3).then(response => {
console.log(response);
})
);