#angular #google-chrome #http2
#угловой #google-chrome #http2
Вопрос:
У меня есть угловой веб-сайт, который должен отправлять запросы на отдых в серверную часть. Чтобы быстрее получать необходимые данные, я хочу использовать протокол HTTP/2, который позволяет выполнять несколько параллельных запросов по одному соединению.
Это мой код Angular 11 (машинописный текст), отправляющий 40 запросов в цикле:
const observables: Observablelt;RecordingStepScreenshotgt;[] = []; const endpoint = ...; for (let i = 0; i lt; 40; i ) { observables.push(this.http.getlt;RecordingStepScreenshotgt;(endpoint)); } forkJoin(observables).subscribe((result) =gt; { console.log('execution of all calls has been finished'); });
В приведенном выше фрагменте я параллельно выдаю 40 HTTP-запросов «get». Я использую «forkJoin», чтобы дождаться завершения всех наблюдаемых.
Я ожидал, что все они будут выпущены и завершены примерно в одно и то же время (параллельно). Однако в браузере (Chrome 96) Я вижу, что запросы выдаются один за другим, как бы водопадом:
Чего мне не хватает?
Комментарии:
1. Браузеры имеют максимальное количество запросов, которые они будут выполнять одновременно…
2. @Carsten это правильно, но актуально только для HTTP 1. Я видел своими глазами несколько лет назад, как несколько (десятков) статических ресурсов загружались параллельно по http 2. Однако в то время я не пытался выполнять вызовы Ajax. Кроме того, даже через браузер http1 можно выдавать большие объемы из 6-8 запросов, но здесь я вижу только один за раз
Ответ №1:
На случай, если кто-нибудь сочтет это полезным:
Как я обнаружил в другом ответе SO, когда Chrome видит несколько запросов к одному и тому же месту назначения (это то, что я сделал в своем примере), он ожидает завершения предыдущего запроса, чтобы сохранить следующие вызовы. Это поведение можно изменить, отключив кэш (заголовок хранилища без кэша). При отправке нескольких запросов в разные пункты назначения все запросы выполняются параллельно, как и ожидалось.
Комментарии:
1. Я также сталкиваюсь с той же проблемой в angular 8/12. Я использовал forkjoin для параллельного вызова 3 api. Но все равно звонки идут последовательно и ждут завершения других. постоянные наблюдаемые: любые[] = []; наблюдаемые.push(это.leaderboardAgentDetailsService.getRewardsPoints().труба(ошибка(e =gt; из(«)))); наблюдаемые.push(это.leaderboardAgentDetailsService.getPursuitsLevel().труба(ошибка(e =gt;gt; из(ошибка)))); наблюдаемые.push(это.leaderboardAgentDetailsService.getTrivia().pipe(ошибка(e = gt; gt; gt; (ошибка)))); forkJoin(наблюдаемые).подписаться( (соотв.: любой) =gt;gt;gt;gt; {
2. Что я увидел, так это то, что после установки заголовков все вызовы не работают параллельно. Как только удалите заголовки запросов, затем работайте правильно