RxJS сканирование для накопления результатов базы данных с использованием фильтра и смещения в качестве параметров URL - PullRequest
0 голосов
/ 17 октября 2019

У меня есть два поведенческих объекта

offset = new behaviorSubject<sring>(null)
filter = new behaviorSubject<string>(null)

Я делаю следующее ..

combineLatest(
    this.offset, // last item in the list, ID for example
    this.filter //  can be any string
).pipe(
    mergeMap(([offset, filter]) => this.getChunkOfTen(offset, filter)),
    scan((acc, chunkOfTen) => {
        return { ...acc, ...chunkOfTen }
    }, {}),
    map(results => Object.values(results)) // to be able to loop on the frontend
)

Когда страница загружается, я получаю 10записей из БД, на Scroll я получаю еще 10 и еще 10 .. вот за что отвечают mergeMap и scan (как и ожидалось).

onFilter все существующие записи удалены (как и ожидалось), и я получаю НОВЫЕ 10 отфильтрованных записей из БД, СЕЙЧАС, когда я прокручиваю, я НЕ получаю больше записей, и у меня они есть в БД.

насколько я знаю, в чем проблема .. в scan operator

есть оператор if else? или некоторые другие операторы, которые я могу использовать перед scan ?

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

найдено там, где была проблема .. это не в combineLatest и scan
после filtering все, что мне нужно было сделать, это сбросить offset наблюдаемый обратно на null, чтобы он мог получитьновый offset из отфильтрованных элементов в списке.

0 голосов
/ 17 октября 2019

Ничто не мешает вам подняться на один уровень абстракции и иметь дело с так называемыми "наблюдаемыми более высокого порядка" - теми, которые относятся к типу ... Observable<Observable<T>>. Также документация гласит:

Имейте в виду, что comblatest не будет выдавать начальное значение, пока каждое наблюдаемое не выдаст хотя бы одно значение. Это то же самое поведение, что и в случае с LastFrom, и может быть ошибкой, поскольку не будет выходных данных и ошибок, но одна (или более) из ваших внутренних наблюдаемых, вероятно, не функционирует должным образом, или подписка задерживается.

Если вы чувствуете, что мой ответ не имеет ничего общего с вашей проблемой, то, пожалуйста, предоставьте более подробную информацию, и я обновлю себя.


Нет, scan, скорее всего, не является причинойВот. combineLatest есть. Прежде всего, это не видно при вызове как фильтрации, так и прокрутки next;один из них может даже complete, и если это так, то вот, пожалуйста. Во-вторых, scan - это reduce с дополнительной функцией: это next не только конечный результат сокращения, но и промежуточные результаты, вот и все, больше ничего. Наконец, что не менее важно, вы можете решить подключить tap(console.log) (или положиться на debugger) по всем своим каналам, чтобы быстро проверить, что происходит.

...