Вы можете попробовать использовать операторы Rx JS bufferCount
и concatMap
вместе с forkJoin()
.
From bufferCount
docs:
Собирать передаваемые значения до тех пор, пока не будет выполнено заданное число, передать как массив.
Таким образом, он собирает n
количество уведомлений и отправляет его как массив. Затем мы могли бы передать массив через forkJoin()
для n
количества параллельных запросов.
Попробуйте следующее
Я предполагаю, что this.urls
- это набор HTTP-запросов, подобных
urls = [
this.http.get('url1'),
this.http.get('url2'),
this.http.get('url3'),
...
];
Тогда код срабатывания запросов будет иметь вид
bufferedRequests() {
from(this.urls).pipe(
bufferCount(6), // <-- adjust number of parallel requests here
concatMap(buffer => forkJoin(buffer))
).subscribe(
res => console.log(res),
err => console.log(err),
() => console.log('complete')
);
}
Согласно этому комментарию инженера Chromium, фактическое решение макс. соединения с ограничением хоста / домена будут использовать WebSockets или сегментирование домена. Но поскольку вы упомянули, что это невозможно в вашей среде, вы можете использовать обходной путь буферизованного запроса.
Однако я бы не стал пытаться буферизовать до максимального предела. Если бы вы отправили в один и тот же домен больше запросов, чем разрешено максимально, вы могли бы увидеть, что дополнительные запросы фактически будут задерживаться до тех пор, пока вышеуказанные запросы не будут завершены. Скажем, если буферизовать максимально допустимый предел, и ваше приложение отправляет дополнительный запрос в тот же домен из другого места, от которого зависит рабочий процесс приложения, все приложение может задросселировать.
Так что лучше используйте либо WebSockets, либо сегментирование домена. И если ни то, ни другое невозможно, лучше буферизовать запросы на количество запросов меньше * максимально допустимого лимита.
* Очевидно, если вы уверены на 100% никакие другие запросы не будут отправляться к тому же домену во время процедуры буферизации, тогда вы можете буферизовать до макс. допустимый предел.