Une semblable recherche réponse a été downvoted. Mais je pense que je peux justifier ce que je propose ici pour des cas limités.
S'il est vrai qu'un observable n'a pas de valeur actuelle , il aura très souvent une valeur immédiatement disponible . Par exemple, avec les magasins redux / flux / akita, vous pouvez demander des données à un magasin central, sur la base d'un certain nombre d'observables et cette valeur sera généralement immédiatement disponible.
Si tel est le cas, lorsque vous subscribe
, la valeur reviendra immédiatement.
Supposons donc que vous ayez appelé un service et, une fois terminé, vous souhaitez obtenir la dernière valeur de quelque chose de votre magasin, qui pourrait ne pas émettre :
Vous pourriez essayer de le faire (et vous devriez autant que possible garder les choses «à l'intérieur des tuyaux»):
serviceCallResponse$.pipe(withLatestFrom(store$.select(x => x.customer)))
.subscribe(([ serviceCallResponse, customer] => {
// we have serviceCallResponse and customer
});
Le problème avec cela est qu'il se bloquera jusqu'à ce que l'observable secondaire émette une valeur, qui pourrait potentiellement ne jamais l'être.
Je me suis retrouvé récemment à avoir besoin d'évaluer un observable uniquement si une valeur était immédiatement disponible , et plus important encore, j'avais besoin de pouvoir détecter si ce n'était pas le cas. J'ai fini par faire ça:
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');
}
});
Notez que pour tout ce qui précède, j'utilise subscribe
pour obtenir la valeur (comme @Ben en parle). Ne pas utiliser de .value
propriété, même si j'en avais BehaviorSubject
.