Возвращая комбинацию, которую можно наблюдать из функции с аргументом

#javascript #angular #rxjs

Вопрос:

Я не совсем уверен, правильно ли я это делаю.

У меня есть простой function , у argument которого есть то, что я хочу использовать внутри combineLatest наблюдаемого. Затем это наблюдаемое возвращается.

 fn(arg) {  return combineLatest([  observable...,  observable...,  ]).pipe(  map(() =gt; arg)  );  }  

Проблема здесь в том, что когда функция вызывается много раз, она создает повторяющиеся наблюдаемые объекты.

Каково было бы правильное решение? Чтобы сделать аргумент тоже заметным? Таким образом, функция вызывается только один раз, но она возвращает правильное значение при изменении аргумента.

Комментарии:

1. можете ли вы создать для этого stackbliz, было бы действительно полезно узнать и решить вашу проблему

2. это звучит так, как будто вы с самого начала неправильно используете наблюдаемое. Вся концепция позволяет Наблюдаемому обеспечить поток значений с течением времени, который затем потребляет потребитель. Это звучит так, как будто вы пытаетесь использовать наблюдаемые объекты в качестве обещаний. Вы, конечно, можете сделать это (вернуть обещание) из вашего obvserable — тогда, как только он разрешится, он больше не будет дублироваться. В качестве альтернативы вы можете отказаться от подписки на Наблюдаемое, и это тоже может сработать (в зависимости от того, как все написано в вашем приложении).

3. @RandyCasburn Возможно, вы совершенно правы. Что бы вы предложили? Я не думаю, что преобразование его в обещание-это решение. Обещание выполняется только один раз, но я хочу прослушать изменения, которые происходят внутри самой заметной комбинации.

4. Потребуется гораздо больше подробностей о том, как работает ваше приложение, создаются наблюдаемые объекты, к какому типу они относятся и так далее. observable... это ничего не значит и не дает никакого понимания.

5. @RandyCasburn я понимаю. Я обновлю сообщение позже сегодня, когда закончу на работе. Спасибо!

Ответ №1:

Решение заключается в том, чтобы не использовать Observables этот способ. Используйте a Subject для такого рода вещей:

 readonly actionSubject = new Subjectlt;unknowngt;();  ...  ngOnInit(): void {  this.actionSubject.pipe(  switchMap(newValue =gt;   combineLatest([  observable...,  observable...,  ]).pipe(map(() =gt; newValue)),  )  ).subscribe(); }   ... ngOnDestroy(): void {  this.actionSubject.complete(); }  

И вместо использования вашей функции вместо fn :

 this.actionSubject.next(someNewValue);  

Что здесь происходит? SwitchMap остановит ваш старый поток и начнет новый каждый раз, когда у вас будет новое значение. Это решение.