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
.
getValue()
un drapeau rouge ÉNORME vous fait quelque chose de mal. Il est là comme une trappe d'évacuation. Généralement, tout ce que vous faites avec RxJS doit être déclaratif.getValue()
est impératif. Si vous utilisezgetValue()
, il y a 99,9% de chances que vous fassiez quelque chose de mal ou de bizarre.BehaviorSubject<boolean>(false)
et que je souhaite le basculer?foo$
c'était unBehaviorSubject
(c'est-à-dire qu'il est défini commeObservable
et peut-être qu'il fait chaud ou froid à partir d'une source différée). Cependant , puisque vous allez ensuite à utiliser.next
sur$foo
lui - même qui signifie que votre mise en œuvre repose sur elle étant unBehaviorSubject
donc il n'y a aucune raison pour ne pas utiliser simplement.value
pour obtenir la valeur actuelle en premier lieu.