Звонок подписаться внутри подписки
Есть две переменные в зависимости друг от друга (цвет и изображение). Зависимость означает следующее: когда переменный цвет имеет значение "СИНИЙ", я хочу отфильтровать все изображения, которые имеют синий цвет и т. Д. Переменные картинки - это тема с вызовом сервиса / бэкэнда:
this.colorSubject.subscribe((color) => {
subject.switchMap((searchTerm: string) => serviceCall(searchTerm, color) ).subsribe(...)
});
Для этого мне нужно прослушать изменение переменной цвета и затем вызвать вышеуказанную строку кода. Но это вызывает многократные вызовы сервиса.
Есть идеи, как справиться с этой проблемой?
1 ответ
Если я вас правильно понимаю, вам нужен третий поток, представляющий объединенный результат color
а также pictures
, Давайте назовем это filteredPictures$
, Этот поток должен использовать color
а также pictures
с помощью combineLatest
, Теперь, если какой-либо из потоков изменится, filteredPictures$
уведомит всех подписчиков о новом значении.
const {
Subject,
from,
combineLatest
} = rxjs;
const {
withLatestFrom,
switchMap
} = rxjs.operators;
const color = new Subject();
const pictures = new Subject();
function service(searchTerm = "house", colorTerm = "green") {
return Promise.resolve([`${searchTerm}.jpg`, `${colorTerm}.png`]);
}
const color$ = color.asObservable();
const pictures$ = pictures.asObservable();
const filteredPictures$ = combineLatest(
pictures$,
color$
).pipe(switchMap(([searchTerm, colorTerm]) => from(service(searchTerm, colorTerm))));
filteredPictures$.subscribe(console.log);
pictures.next("water");
setTimeout(() => {
color.next("yellow");
setTimeout(() => {
pictures.next("helicoptor");
setTimeout(() => {
color.next("red");
}, 1000);
}, 1000);
}, 1000);
<script src="https://unpkg.com/rxjs/bundles/rxjs.umd.min.js"></script>