Una simile ricerca risposta è stata downvoted. Ma penso di poter giustificare ciò che sto suggerendo qui per casi limitati.
Mentre è vero che un osservabile non ha un valore corrente , molto spesso avrà un valore immediatamente disponibile . Ad esempio con i negozi redux / flux / akita è possibile richiedere dati a un negozio centrale, in base a un numero di osservabili e quel valore sarà generalmente immediatamente disponibile.
Se questo è il caso allora subscribe
, il valore tornerà immediatamente.
Supponiamo quindi che tu abbia ricevuto una chiamata a un servizio e, al termine, desideri ottenere l'ultimo valore di qualcosa dal tuo negozio, che potenzialmente potrebbe non emettere :
Potresti provare a farlo (e dovresti, per quanto possibile, tenere le cose 'dentro le pipe'):
serviceCallResponse$.pipe(withLatestFrom(store$.select(x => x.customer)))
.subscribe(([ serviceCallResponse, customer] => {
// we have serviceCallResponse and customer
});
Il problema è che si bloccherà fino a quando l'osservabile secondario non emetterà un valore, che potenzialmente potrebbe non essere mai.
Mi sono ritrovato di recente a dover valutare un osservabile solo se un valore era immediatamente disponibile e, soprattutto, dovevo essere in grado di rilevare se non lo fosse. Ho finito per fare questo:
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');
}
});
Nota che per quanto sopra sto usando subscribe
per ottenere il valore (come discute da @Ben). Non usare una .value
proprietà, anche se avevo un BehaviorSubject
.