Um semelhante à procura resposta foi downvoted. Mas acho que posso justificar o que estou sugerindo aqui para casos limitados.
Embora seja verdade que um observável não tenha um valor atual , muitas vezes ele terá um valor imediatamente disponível . Por exemplo, nos repositórios redux / flux / akita, você pode solicitar dados de um repositório central, com base em vários observáveis e esse valor geralmente estará disponível imediatamente.
Se for esse o caso, quando você subscribe
o valor voltará imediatamente.
Então, digamos que você tenha telefonado para um serviço e, ao concluir, deseja obter o valor mais recente de algo da sua loja, que potencialmente não seja emitido :
Você pode tentar fazer isso (e manter o máximo possível as coisas 'dentro dos tubos'):
serviceCallResponse$.pipe(withLatestFrom(store$.select(x => x.customer)))
.subscribe(([ serviceCallResponse, customer] => {
// we have serviceCallResponse and customer
});
O problema é que ele será bloqueado até que o observável secundário emita um valor, o que potencialmente nunca poderia ser.
Recentemente, me vi precisando avaliar um observável apenas se um valor estivesse disponível imediatamente e, mais importante, eu precisava ser capaz de detectar se não estava. Acabei fazendo isso:
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');
}
});
Observe que, para todas as opções acima, estou usando subscribe
para obter o valor (como @Ben discute). Não .value
estou usando uma propriedade, mesmo que eu tivesse um BehaviorSubject
.