Сценарий:
- Пользователь использует фильтры, объединенные в единый поток
- Когда фильтры меняются, событие для бэкэнда запускается для получения «дешевых» данных.
- Когда поступают «дешевые» данные, другой запрос с теми же параметрами отправляется в другую конечную точку, которая возвращает «дорогие» данные, которые будут использоваться для обогащения дешевых данных. Запрос должен быть задержан на 1 секунду и запущен только в том случае, если пользователь не меняет ни один из фильтров (иначе он должен ждать 1 секунду).
И я борюсь с 3) вариантом без промежуточных переменных.
let filterStream = Rx.Observable
.combineLatest(
filterX,
filterY,
(filterX, filterY) => {
x: filterX,
y: filterY
}
)
.map((filters) => {
limit: 100,
s: filters.x.a,
f: filters.x.b + filters.y.c,
})
.distinctUntilChanged()
let cheapDataStream = filterStream
.flatMapLatest((filterQuery) =>
Rx.Observable.fromPromise(cheapBackendApiCall(filterQuery)))
// render cheap results
cheapDataStream
.map(result => transformForDisplay(result))
.subscribe(result => {
//render
// how do i invoke expensiveApiCall() with `filterQuery` data here?
// with a delay, and only if filterQuery has not changed?
});