Eine ähnlich aussehende Antwort wurde abgelehnt. Aber ich denke, ich kann rechtfertigen, was ich hier für begrenzte Fälle vorschlage.
Es stimmt zwar, dass ein Observable keinen aktuellen Wert hat, aber sehr oft hat es einen sofort verfügbaren Wert. Beispielsweise können Sie bei Redux / Flux / Akita-Speichern Daten von einem zentralen Speicher anfordern, die auf einer Reihe von Observablen basieren, und dieser Wert ist im Allgemeinen sofort verfügbar.
Wenn dies der Fall ist subscribe
, wird der Wert sofort wieder angezeigt.
Nehmen wir also an, Sie haben einen Anruf bei einem Dienstleister erhalten und möchten nach Abschluss den neuesten Wert von etwas aus Ihrem Geschäft abrufen, das möglicherweise nicht ausgegeben wird :
Sie könnten versuchen, dies zu tun (und Sie sollten die Dinge so weit wie möglich in Rohren aufbewahren):
serviceCallResponse$.pipe(withLatestFrom(store$.select(x => x.customer)))
.subscribe(([ serviceCallResponse, customer] => {
// we have serviceCallResponse and customer
});
Das Problem dabei ist, dass es blockiert, bis das sekundäre Observable einen Wert ausgibt, der möglicherweise niemals sein könnte.
Vor kurzem musste ich ein Observable nur dann bewerten, wenn ein Wert sofort verfügbar war , und was noch wichtiger war, ich musste erkennen können, ob dies nicht der Fall war. Am Ende habe ich das gemacht:
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');
}
});
Beachten Sie, dass ich für alle oben genannten subscribe
Punkte den Wert erhalte (wie in @Ben erläutert). Ich benutze keine .value
Immobilie, auch wenn ich eine hatte BehaviorSubject
.