4
respostas

Dúvida sobre Subject

Olá,

Essa dúvida é mais para ver se eu entendi certo sobre Subject.

Peguei esse exemplo na internet

let subject = new Subject<string>();
// We subscribe to the subject
subject.subscribe((data) => {
  console.log("Subscriber got data >>>>> "+ data);
});

// We use the subject to emit data
subject.next("Eureka");

// Console result: Subscriber got data >>>>> Eureka

quando eu dou `subject.subscribe`() eu estou dizendo ao observador que se houver novos dados ele exibir ?

E quando eu dou o subject.next() estou enviando dados para o observador ?

  • Subject seria alguns amigos brincando de dominó e todos que estão jogando estariam inscritos no Subject, então recebem infomações que está nesse Subject, certo ?

  • Então quando alguém fala: "Subject, já joguei" então todos que estão inscritos recebem essa informação.

seria algo assim ou viajei ?

4 respostas

Esse exemplo que me respondeu em um outro topico, eu demorei bastante pra entender

mport { Injectable } from '@angular/core'

import { Observable, Subject, empty, of } from 'rxjs'
import { switchMap } from 'rxjs/operators'

@Injectable({
    providedIn: 'root'
})
export class EventService {

    private event: Subject<any> = new Subject<any>();

    emit(topic, data) {
        this.event.next({ topic, data });
    }

    listen(topic): Observable<any> {
        return this.event
            .pipe(switchMap(data => {
                if (topic === data.topic) {
                    return of(data)
                }
                return empty()
            }))
    }

}

Neste caso eu injetaria esse serviço no serviço que vê se está online ou offline e depois usaria o Service que emite se o usuário está online ou offline pelo método :

emit(topic, data), ai dai ele emitiria dizendo que houve mudanças nos dados para todos que estão inscritos nele ?

Ai a partir do service que busca os dados da API eu me inscreveria nesse Observable usando o método:

listen.subscribe() ? com o retorno dele eu saberia se o usuário está on ou off sem ter que fazer varias injeções de dependencias, né ?

Cara, estou impressionado com esse lance de Observable, mudou minha vida ksk

Boa noite, Dalcy! Como vai?

Quando vc faz subscribe() num Subject vc está informando que quer observar esse subject em questão! E a função passada como argumento do subscribe() será executada toda vez que novos dados forem enviados através do método next().

Subject seria alguns amigos brincando de dominó e todos que estão jogando estariam inscritos no Subject, então recebem infomações que está nesse Subject, certo ?

Então quando alguém fala: "Subject, já joguei" então todos que estão inscritos recebem essa informação.

É isso aí!

Já sobre o EventService que vc colou no seu primeiro comentário, o ideal seria que vc perguntasse diretamente a quem te mandou esse código no tópico ao qual vc se referiu. A pessoa certamente poderia te dar uma orientação melhor!

Mas, de forma geral, vc usaria o método emit() para emitir novos valores. E sempre que isso ocorresse, todos que tenham se inscrito através de listen().subscribe() receberiam a notificação!

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Então seria legal fazer um acesso a API com Subject, aí todos que queiram os dados dessa subject era só observar eles com subscribe() ?

Opa, Dalcy! Exatamente, seu raciocínio está no caminho correto! Inclusive, é justamente por isso que o HttpClient do Angular sempre retorna um Observable de seus métodos de envio de requisição HTTP! E veja só que interessante: a classe Observable é mãe da classe Subject!

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!