Preciso criar uma assinatura para uma Observable
que seja imediatamente descartada quando for chamada pela primeira vez.
Existe algo como:
observable.subscribeOnce(func);
No meu caso de uso, estou criando uma assinatura em um manipulador de rota expressa e a assinatura está sendo chamada várias vezes por solicitação.
observable.pipe(first()).subscribe(func)
, de ondefirst
vemrxjs/operators
.O RxJS tem algumas das melhores documentações que já encontrei. Seguir o link abaixo o levará a uma tabela extremamente útil para mapear casos de uso para operadores. Por exemplo, no âmbito do "eu quero tomar o primeiro valor" caso de uso são três operadores:
first
,firstOrDefault
, esample
.Observe que, se uma sequência observável for concluída sem notificações, o
first
operador notificará os assinantes com um erro enquanto ofirstOrDefault
operador fornecerá um valor padrão aos assinantes.pesquisa de caso de uso do operador
fonte
Se você quiser chamar um Observable apenas uma vez, isso significa que você não esperará um fluxo dele. Portanto, usar em
toPromise()
vez desubscribe()
seria suficiente no seu caso, poistoPromise()
não precisa de cancelamento de inscrição.fonte
await
opromise
que o torna únicoPara complementar a resposta de @ Brandon , usar
first()
ou algo semelhante também é essencial para atualizar uma comBehaviorSubject
base em suaObservable
. Por exemplo (não testado):fonte
Versão Limpa e Conveniente
Expandindo a incrível resposta do M Fuat NUROĞLU em converter o observável em uma promessa, aqui está a versão muito conveniente.
A vantagem disso é que podemos usar esse valor como uma variável normal sem introduzir outro bloco aninhado!
Isso é especialmente útil quando você precisa obter vários valores de vários observáveis. Arrumado e limpo.
Obviamente, você terá que fazer a sua função de contenção
async
se quiser seguir esta rota. Você também pode apenas.then
prometer se não deseja que a função que contém seja assíncronaNão tenho certeza se existem vantagens e desvantagens com essa abordagem. Fique à vontade para nos informar nos comentários, para que possamos estar cientes.
PS Se você gostou desta resposta, não se esqueça de votar também na resposta de M Fuat NUROĞLU :)
fonte
Eu tive uma pergunta semelhante.
Abaixo foi chamado ainda mais tarde a partir de diferentes alteradores de estado. Como eu não queria.
Eu decidi tentar
unsubscribe()
depois de assinar como abaixo.subscribe(func).unsubscribe();
é comosubscribeOnce(func)
.Espero que tenha ajudado você também.
fonte