Muszę utworzyć subskrypcję, Observable
która jest usuwana natychmiast po pierwszym wywołaniu.
Czy jest coś takiego:
observable.subscribeOnce(func);
Mój przypadek użycia, tworzę subskrypcję w programie obsługi trasy ekspresowej, a subskrypcja jest wywoływana wiele razy na żądanie.
observable.pipe(first()).subscribe(func)
, skądfirst
pochodzirxjs/operators
.RxJS ma jedną z najlepszych dokumentacji, z jaką kiedykolwiek się spotkałem. Podążanie za poniższym linkiem przeniesie Cię do niezwykle pomocnej tabeli mapującej przypadki użycia na operatory. Na przykład, w ramach programu „Chcę podjąć pierwszą wartość” przypadek użycia są trzy podmioty:
first
,firstOrDefault
, isample
.Uwaga, jeśli obserwowalna sekwencja zakończy się bez powiadomień, wówczas
first
operator powiadamia abonentów o błędzie, podczas gdyfirstOrDefault
operator podaje abonentom wartość domyślną.wyszukiwanie przypadków użycia przez operatorów
źródło
Jeśli chcesz wywołać Observable tylko raz, oznacza to, że nie będziesz czekać na strumień z niego. Więc używanie
toPromise()
zamiast tegosubscribe()
wystarczyłoby w twoim przypadku, ponieważtoPromise()
nie wymaga rezygnacji z subskrypcji.źródło
await
to,promise
co czyni to jednym liniowcemAby uzupełnić odpowiedź @ Brandon , użycie
first()
lub podobne jest również niezbędne do aktualizacjiBehaviorSubject
opartej na jejObservable
. Na przykład (nieprzetestowane):źródło
Czysta i wygodna wersja
Rozwijając niesamowitą odpowiedź M Fuat NUROĞLU na temat przekształcania tego, co obserwowalne w obietnicę, oto bardzo wygodna jej wersja.
Piękno tego polega na tym, że możemy użyć tej wartości jak normalnej zmiennej bez wprowadzania kolejnego zagnieżdżonego bloku!
Jest to szczególnie przydatne, gdy trzeba uzyskać wiele wartości z wielu obserwacji. Schludnie i czysto.
Oczywiście będziesz musiał wykonać swoją funkcję zawierającą,
async
jeśli chcesz iść tą trasą. Możesz także po prostu.then
obiecać, jeśli nie chcesz, aby funkcja zawierająca była asynchronicznaNie jestem pewien, czy istnieją kompromisy w tym podejściu, daj mi znać w komentarzach, abyśmy byli świadomi.
PS Jeśli podobała Ci się ta odpowiedź, nie zapomnij też zagłosować za odpowiedzią M Fuat NUROĞLU :)
źródło
Miałem podobne pytanie.
Poniżej został wezwany jeszcze później z różnych zmieniaczy stanu. Ponieważ nie chciałem.
Postanowiłem spróbować
unsubscribe()
po zasubskrybowaniu, jak poniżej.subscribe(func).unsubscribe();
jest jaksubscribeOnce(func)
.Mam nadzieję, że to też pomogło.
źródło