Я создаю приложение angular, в котором я пытаюсь реализовать как можно больше реактивным способом, используя Rx JS.
Я реализую что-то вроде карусели - где следующий элемент отображается на действия пользователя. Товары принимаются от BE по одному. Я пытаюсь сделать пользовательский опыт гладким. Итак, я хочу предварительно загрузить первые N элементов, прежде чем что-либо показывать пользователю.
После загрузки N элементов - мне нужно показать первый загруженный элемент. Когда пользователь нажимает «следующий» - я запускаю следующий предварительно загруженный элемент и запускаю предварительную загрузку следующего элемента, чтобы убедиться, что количество предварительно загруженных элементов всегда равно N.
Тип буфера - чтобы не заставлять пользователя ждать на каждом шаге. Итак, следующие элементы предварительно загружаются, пока пользователь все еще просматривает предыдущие.
Я думал использовать что-то вроде bufferCount(N)
при загрузке элементов, а затем распределить массив с помощью map((ar) => from(ar))
. И с другим уведомителем Subject
, использующим zip
для запуска выбросов из этого буфера ... Но, похоже, он работает не очень хорошо. Похоже, что при каждом выбросе N у меня возникает какой-то сбой, когда я сначала вижу один элемент, а затем быстро другой.
Не уверен, как реализовать это лучше. Похоже, что это должен быть общий случай использования.
---- Edit ----
Элементы загружаются через http, верно. Вот код, который у меня есть atm (не совсем функциональный - просто концепция):
//..........
// loadRndItem loads data using httpClient
this.loadingBuffer$ = this.nextItemSubj.pipe(
// here should somehow trigger first N loading processes
flatMap(() => this.loadRndItem()),
bufferCount(this.bufferSize),
flatMap((ar) => {
return from(ar);
}),
share(),
takeUntil(this.endSubj)
);
this.currentItem$ = zip(
this.loadingBuffer$,
this.nextItemSubj
).pipe(
map(([val, _]) => val),
share(),
takeUntil(this.gameEndSubj)
);
//..........
function nextItem(): void {
this.nextItemSubj.next();
}