Rxjs / реактор предельный оператор эквивалент для запросов AJAX - PullRequest
0 голосов
/ 28 ноября 2018

То, что я пытаюсь достичь, - это одновременно выполнять несколько запросов ajax (варьируются от 10 до 1000+), но с ограничением активных запросов в 5 (например, очередь FIFO с точки зрения выполнения запроса).

Например, у нас есть массив из 100 http-адресов, и мы хотим получить первые 5 и выполнить запрос GET для каждого, если любой из этих пяти запросов заканчивается, тогда другой адрес должен войти в очередь и выполнить свой запрос GET, пока все 100адреса делают запрос и заканчивают работу.

С библиотекой реактора есть оператор limitRequest , который подходит под мое описание

Мой вопрос: как мне добиться аналогичного поведения с rxjs?

Я пытался с оператором буфера, но он выдает результаты каждые 5 запросов, я хочу, чтобы выдать результаты, как только запрос будет завершен.

Я создал stackblitz

пытается экспериментировать на этом

1 Ответ

0 голосов
/ 28 ноября 2018

Вы можете сделать все это только с двумя mergeMap с.Оператор mergeMap принимает второй параметр, который является числом одновременных наблюдаемых.Первый mergeMap будет использоваться для распаковки массива URL-адресов, поступающих с сервера, а второй будет хранить 5 одновременных запросов:

На основе вашей демонстрации stackblitz (спасибо, что предоставили демо, кстати) выможете поместить все это в одну цепочку RxJS.

from(axios.get("https://jsonplaceholder.typicode.com/photos")).pipe(
  mergeMap(response => response.data // Unwrap the array of URLs into single emissions
    .filter(x => x.albumId === 100)
    .map(x => x.url)
  ),
  mergeMap(url => of(url).pipe(delay(1000 * Math.random())), 5), // Mock additional requests with of() and delay()
).subscribe(console.log);

Ваша обновленная демка: https://stackblitz.com/edit/photo-dls-pb27pn?file=index.js

...