Una similares buscando respuesta fue downvoted. Pero creo que puedo justificar lo que estoy sugiriendo aquí para casos limitados.
Si bien es cierto que un observable no tiene un valor actual , a menudo tendrá un valor disponible de inmediato . Por ejemplo, con las tiendas redux / flux / akita puede solicitar datos de una tienda central, en función de una cantidad de observables y ese valor generalmente estará disponible de inmediato.
Si este es el caso, entonces cuando usted subscribe
, el valor volverá inmediatamente.
Entonces, digamos que recibió una llamada a un servicio, y al finalizar desea obtener el último valor de algo de su tienda, que posiblemente no emita :
Puede intentar hacer esto (y debe mantener todo lo posible 'cosas dentro de las tuberías'):
serviceCallResponse$.pipe(withLatestFrom(store$.select(x => x.customer)))
.subscribe(([ serviceCallResponse, customer] => {
// we have serviceCallResponse and customer
});
El problema con esto es que se bloqueará hasta que el observable secundario emita un valor, que potencialmente nunca podría ser.
Recientemente me encontré necesitando evaluar un observable solo si un valor estaba disponible de inmediato , y lo que es más importante, necesitaba poder detectar si no lo estaba. Terminé haciendo esto:
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');
}
});
Tenga en cuenta que para todo lo anterior, estoy usando subscribe
para obtener el valor (como comenta @Ben). No usar una .value
propiedad, incluso si tuviera un BehaviorSubject
.