подскажите, что мне нужно подправить
Всё нужно подправить. А ещё больше - сделать.
Ваша функция никак не извещает вызывающий код о том, что запросы выполнены и с какими результатами; результаты запросов - вместо того, чтобы сохранять все, сохраняете только последний полученный; вместо того, чтобы ограничить количество одновременно выполняемых запросов вы пропускаете один (кажется, вы просто не понимаете, как работает forEach).
Пусть функция возвращает промис, который будет резолвиться после получения результатов всех запросов.
Под хранение результатов запросов создадим массив.
Так как url'ы могут повторяться, а запросы не должны, выполним группировку массива url'ов в объект: ключи - url'ы, значения - массивы индексов, под которыми данный url встречается в исходном массиве. Выдернем из этого объекта ключи - это будет массив уникальных url'ов.
Также создадим два счётчика - количество отправленных запросов и количество полученных ответов.
Собственно запрос. Первым делом проверяем, сколько ответов получено - если все, резолвим промис массивом результатов. В противном случае проверяем, сколько запросов отправлено - если не все, увеличиваем соответствующий счётчик, отправляем запрос; по получении ответа достаём массив индексов url'а, сохраняем результат, увеличиваем счётчик полученных ответов и пытаемся отправить следующий запрос.
Ну и запускаем всё это дело в работу - обычный цикл for, в котором на каждой итерации выполняется запрос. Минимум одна итерация (это на тот случай, если массив url'ов пустой), максимум - количество уникальных url'ов или ограничение на количество одновременных запросов, меньшее из этих значений.
Всё:
function makeRequests(urls, max) {
return new Promise(resolve => {
const results = Array(urls.length).fill(null);
const groupedUrls = urls.reduce((acc, n, i) => ((acc[n] ??= []).push(i), acc), {});
const uniqueUrls = Object.keys(groupedUrls);
let countRequests = 0;
let countResponses = 0;
for (let i = 0; i < Math.max(1, Math.min(max, uniqueUrls.length)); i++) {
request();
}
function request() {
if (countResponses === uniqueUrls.length) {
resolve(results);
} else if (countRequests < uniqueUrls.length) {
const url = uniqueUrls[countRequests++];
fetch(url)
.then(result => result.json())
.catch(error => error)
.then(result => {
groupedUrls[url].forEach(n => results[n] = result);
countResponses++;
request();
});
}
}
});
}