Podobna patrząc odpowiedź została downvoted. Ale myślę, że mogę uzasadnić to, co sugeruję tutaj w ograniczonych przypadkach.
Chociaż prawdą jest, że obserwowalne nie ma bieżącej wartości, bardzo często będzie miało natychmiast dostępną wartość. Na przykład w sklepach redux / flux / akita możesz zażądać danych ze sklepu centralnego, w oparciu o pewną liczbę obserwowalnych, a ta wartość będzie na ogół natychmiast dostępna.
Jeśli tak jest, to kiedy Ty subscribe
, wartość natychmiast wróci.
Powiedzmy, że masz połączenie z usługą, a po zakończeniu chcesz uzyskać najnowszą wartość czegoś ze swojego sklepu, który potencjalnie może nie emitować :
Możesz spróbować to zrobić (i powinieneś w miarę możliwości trzymać rzeczy „wewnątrz rur”):
serviceCallResponse$.pipe(withLatestFrom(store$.select(x => x.customer)))
.subscribe(([ serviceCallResponse, customer] => {
// we have serviceCallResponse and customer
});
Problem polega na tym, że blokuje się, dopóki obserwowalne wtórne nie wyemituje wartości, która potencjalnie może nigdy nie być.
Niedawno stwierdziłam, że muszę ocenić obserwowalne tylko wtedy, gdy wartość jest natychmiast dostępna , a co ważniejsze, muszę być w stanie wykryć, czy nie była. Skończyło się na tym, że:
serviceCallResponse$.pipe()
.subscribe(serviceCallResponse => {
// immediately try to subscribe to get the 'available' value
// note: immediately unsubscribe afterward to 'cancel' if needed
let customer = undefined;
// whatever the secondary observable is
const secondary$ = store$.select(x => x.customer);
// subscribe to it, and assign to closure scope
sub = secondary$.pipe(take(1)).subscribe(_customer => customer = _customer);
sub.unsubscribe();
// if there's a delay or customer isn't available the value won't have been set before we get here
if (customer === undefined)
{
// handle, or ignore as needed
return throwError('Customer was not immediately available');
}
});
Zauważ, że dla wszystkich powyższych używam, subscribe
aby uzyskać wartość (jak omawia @Ben). Nie korzystam z .value
nieruchomości, nawet gdybym miał BehaviorSubject
.