Звонок подписывайся внутри подписывайся - PullRequest
0 голосов
/ 27 сентября 2018

Есть две переменные в зависимости друг от друга (цвет и изображение).Зависимость означает следующее: когда переменный цвет имеет значение «СИНИЙ», я хочу отфильтровать все изображения, которые имеют синий цвет и т. Д.Изображения переменных - это тема вызова службы / бэкэнда:

this.colorSubject.subscribe((color) => {
      subject.switchMap((searchTerm: string) => serviceCall(searchTerm, color) ).subsribe(...)
});

. Для этого мне нужно прослушать изменение переменной цвета и затем вызвать указанную выше строку кода.Но это вызывает многократные обращения в службу.

Есть идеи, как решить эту проблему?

1 Ответ

0 голосов
/ 27 сентября 2018

Если я правильно вас понимаю, вам нужен третий поток, представляющий объединенный результат 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>
...