У меня есть наблюдаемый поток, настроенный, как показано ниже. У меня есть интервал, который опрашивается каждые две секунды. Затем я переключаю это, чтобы сделать два зависимых вызова API (здесь высмеивается с помощью 'of'). После этого я хочу использовать differentUntilChanged, чтобы убедиться, что конечный объект отличается. Единственная вещь заключается в том, что DifferentUntilChanged не срабатывает.
Я предполагаю, что это КАК-ТО связано с тем, что мы создаем новые потоки и поэтому никогда не собираем два объекта для сравнения, но я не совсем понимаю.
interval(2000).pipe(
switchMap(() => loadData()),
)
.subscribe(res => console.info(res)); // { name: 'test' } is printed every two seconds
function loadData() {
return of('API call').pipe(
mergeMap(numb => of({ name: 'test' })),
distinctUntilChanged((prev, cur) => {
console.info('CompareFn'); // This will never fire.
return JSON.stringify(prev) === JSON.stringify(cur)})
);
}
Стек-блиц: https://stackblitz.com/edit/rxjs-ko6k3c?devtoolsheight=60
В этом случае я хотел бы, чтобы из следующего обработчика было напечатано только одно значение, так как DifferentUntilChanged должен останавливать все значения после первого.
Был бы признателен за объяснение, почему это не работает, как я ожидал.





проблема в том, что ваш differentUntilChanged работает с внутренним наблюдаемым, а не с внешним... вам нужно это сделать
interval(2000).pipe(
switchMap(_ => loadData()),
distinctUntilChanged((prev, cur) => {
console.info('CompareFn');
return JSON.stringify(prev) === JSON.stringify(cur);
})
)
.subscribe(res => console.info(res));
function loadData() {
return of('API call').pipe(
mergeMap(numb => of({ name: 'test' }))
);
}
в вашей предыдущей настройке только одно значение когда-либо достигало differentUntilChanged, поскольку интервал переключался на новый наблюдаемый через карту переключения.
Ах, момент лампочки! Очень ценю объяснение.