BehaviorSubject é um tipo de assunto, um assunto é um tipo especial de observável, para que você possa assinar mensagens como qualquer outro observável. Os recursos exclusivos do BehaviorSubject são:
- Ele precisa de um valor inicial, pois sempre deve retornar um valor na assinatura, mesmo que não tenha recebido um
next()
- Na assinatura, ele retorna o último valor do assunto. Um observável regular é acionado apenas quando recebe um
onnext
- a qualquer momento, você pode recuperar o último valor do assunto em um código não observável usando o
getValue()
método
Os recursos exclusivos de um assunto em comparação com um observável são:
- É um observador, além de ser um observável, para que você também possa enviar valores a um sujeito, além de se inscrever nele.
Além disso, você pode obter uma observação do assunto de comportamento usando o asObservable()
método on BehaviorSubject
.
Observable é um genérico e BehaviorSubject
tecnicamente é um subtipo de Observable porque BehaviorSubject é um observável com qualidades específicas.
Exemplo com BehaviorSubject :
// Behavior Subject
// a is an initial value. if there is a subscription
// after this, it would get "a" value immediately
let bSubject = new BehaviorSubject("a");
bSubject.next("b");
bSubject.subscribe(value => {
console.log("Subscription got", value); // Subscription got b,
// ^ This would not happen
// for a generic observable
// or generic subject by default
});
bSubject.next("c"); // Subscription got c
bSubject.next("d"); // Subscription got d
Exemplo 2 com assunto regular:
// Regular Subject
let subject = new Subject();
subject.next("b");
subject.subscribe(value => {
console.log("Subscription got", value); // Subscription wont get
// anything at this point
});
subject.next("c"); // Subscription got c
subject.next("d"); // Subscription got d
Um observável pode ser criado a partir de ambos Subject
e BehaviorSubject
usando subject.asObservable()
.
A única diferença é que você não pode enviar valores para um next()
método observável usando .
Nos serviços Angular, eu usaria BehaviorSubject
para um serviço de dados como um serviço angular, muitas vezes inicializado antes do componente e do comportamento garantirem que o componente que consome o serviço receba os últimos dados atualizados, mesmo que não haja novas atualizações desde a assinatura do componente para esses dados.
Observável: Resultado diferente para cada Observador
Uma diferença muito, muito importante. Como Observable é apenas uma função, ele não possui nenhum estado; portanto, para cada novo Observador, ele executa o código de criação observável repetidamente. Isto resulta em:
Isso causa grandes erros e ineficiências
BehaviorSubject (ou Assunto) armazena detalhes do observador, executa o código apenas uma vez e fornece o resultado a todos os observadores.
Ex:
JSBin: http://jsbin.com/qowulet/edit?js,console
Resultado :
Observe como o uso de
Observable.create
resultados diferentes criados para cada observador, masBehaviorSubject
deu o mesmo resultado para todos os observadores. Isso é importante.Outras diferenças resumidas.
fonte
KnockoutJS's ko.observable()
venha imediatamente verá mais paralelos emRx.BehaviorSubject
comparação com #Rx.Observable
Observável e sujeito são os meios observáveis que um observador pode rastreá-los. mas ambos têm algumas características únicas. Além disso, existem 3 tipos de sujeitos no total, cada um deles novamente com características únicas. vamos tentar entender cada um deles.
Você pode encontrar o exemplo prático aqui no stackblitz . (Você precisa verificar o console para ver a saída real)
Observables
Eles são frios: o código é executado quando eles têm pelo menos um único observador.
Cria cópia de dados: Observable cria cópia de dados para cada observador.
Unidirecional: o observador não pode atribuir valor a observável (origem / mestre).
Subject
Eles são quentes: o código é executado e o valor é transmitido, mesmo que não haja observador.
Compartilha dados: os mesmos dados são compartilhados entre todos os observadores.
bidirecional: o observador pode atribuir valor a observável (origem / mestre).
Se você estiver usando o assunto, você perderá todos os valores transmitidos antes da criação do observador. Então aqui vem o Assunto do Replay
ReplaySubject
Eles são quentes: o código é executado e o valor é transmitido, mesmo que não haja observador.
Compartilha dados: os mesmos dados são compartilhados entre todos os observadores.
bidirecional: o observador pode atribuir valor a observável (origem / mestre). mais
Reproduzir o fluxo de mensagens: não importa quando você assina o assunto da reprodução, receberá todas as mensagens transmitidas.
No assunto e no assunto da reprodução, você não pode definir o valor inicial como observável. Então aqui vem Assunto Comportamental
BehaviorSubject
Eles são quentes: o código é executado e o valor é transmitido, mesmo que não haja observador.
Compartilha dados: os mesmos dados são compartilhados entre todos os observadores.
bidirecional: o observador pode atribuir valor a observável (origem / mestre). mais
Reproduzir o fluxo de mensagens: não importa quando você assina o assunto da reprodução, receberá todas as mensagens transmitidas.
Você pode definir o valor inicial: Você pode inicializar o observável com o valor padrão.
fonte
ReplaySubject
possui um histórico e pode transmitir / emitir uma sequência de valores (antigos). Somente quando o buffer é definido como 1, ele se comporta de maneira semelhante a aBehaviorSubject
.O objeto Observable representa uma coleção baseada em envio.
As interfaces Observer e Observable fornecem um mecanismo generalizado para notificação por push, também conhecido como padrão de design do observador. O objeto Observable representa o objeto que envia notificações (o provedor); o objeto Observer representa a classe que os recebe (o observador).
A classe Subject herda Observable e Observer, no sentido de que é tanto um observador quanto um observável. Você pode usar um assunto para assinar todos os observadores e, em seguida, assinar o assunto em uma fonte de dados de back-end
Mais em https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md
fonte
Uma coisa que não vejo nos exemplos é que, quando você lança BehaviorSubject para Observable via asObservable, ele herda o comportamento de retornar o último valor na assinatura.
É um pouco complicado, pois as bibliotecas costumam expor os campos como observáveis (por exemplo, parâmetros no ActivatedRoute no Angular2), mas podem usar Subject ou BehaviorSubject nos bastidores. O que eles usam afetaria o comportamento da inscrição.
Veja aqui http://jsbin.com/ziquxapubo/edit?html,js,console
fonte
Um observável permite que você se inscreva apenas, enquanto um assunto permite que você publique e se inscreva.
Portanto, um assunto permite que seus serviços sejam usados tanto como publicador quanto como assinante.
A partir de agora, eu não sou tão bom
Observable
assim, vou compartilhar apenas um exemplo deSubject
.Vamos entender melhor com um exemplo de CLI Angular . Execute os comandos abaixo:
Substitua o conteúdo de
app.component.html
por:Execute o comando
ng g c components/home
para gerar o componente inicial. Substitua o conteúdo dehome.component.html
por:#message
é a variável local aqui. Adicione uma propriedademessage: string;
àapp.component.ts
classe de.Execute este comando
ng g s service/message
. Isso irá gerar um serviço emsrc\app\service\message.service.ts
. Forneça este serviço ao aplicativo .Importar
Subject
paraMessageService
. Adicione um assunto também. O código final deve ficar assim:Agora, injete esse serviço
home.component.ts
e passe uma instância para o construtor. Faça issoapp.component.ts
também. Use esta instância de serviço para passar o valor de#message
para a função de serviçosetMessage
:Por dentro
app.component.ts
, inscreva-se e cancele-a (para evitar vazamentos de memória) noSubject
:É isso aí.
Agora, qualquer valor inserido dentro
#message
dehome.component.html
deve ser impresso em{{message}}
dentroapp.component.html
fonte
app.component.ts
behaviour.service.ts
custom.component.ts
fonte
BehaviorSubject vs Observable : o RxJS possui observadores e observáveis, o Rxjs oferece várias classes para usar com fluxos de dados, e uma delas é o BehaviorSubject.
Observáveis : Observáveis são coleções preguiçosas de vários valores ao longo do tempo.
BehaviorSubject : um assunto que requer um valor inicial e emite seu valor atual para novos assinantes.
fonte
Pense no Observables como um cano com água corrente, às vezes a água flui e às vezes não. Em alguns casos, você pode realmente precisar de um cano que sempre tenha água, criando um cano especial que sempre contém uma água, por menor que seja, vamos chamar esse cano especial de BehaviorSubject , se você estiver como fornecedor de água na sua comunidade, você pode dormir em paz à noite, sabendo que o seu tubo recém-instalado simplesmente funciona.
Em termos técnicos: você pode encontrar casos em que um Observable deve sempre ter valor nele; talvez você queira capturar o valor de um texto de entrada ao longo do tempo; em seguida, você pode criar uma instância de BehaviorSubject para garantir esse tipo de comportamento, digamos:
Você pode usar o "valor" para provar alterações ao longo do tempo.
Isso é útil quando você combina o Observables mais tarde, analisando o tipo de seu fluxo como BehaviorSubject, você pode garantir que o fluxo pelo menos seja acionado ou sinalize apenas uma vez pelo menos .
fonte