Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvidas sobre services

Estou usando um service para verificar se quem está acessando está conectado a internet e tenho outro service que busca os dados da API. Minha dúvida é a seguinte, é boa prática eu usar um service criado por mim em outro service ?

Esse é o service que verifica se está conectado na internet

import { Injectable } from '@angular/core';
import { ConnectionService } from 'ng-connection-service';

@Injectable({
  providedIn: 'root'
})
export class InternetConnectService {
  private isConnect: boolean = true;
  constructor(private connectionService: ConnectionService) { }

  isConnected(): boolean {
    this.connectionService.monitor().subscribe(isConnected => {
      this.isConnect = isConnected;
    });

    return this.isConnect;
  }
}

Esse é o segundo service que vai buscar os dados da API

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

import { InternetConnectService } from './internet-connect.service';

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

  constructor(private http: HttpClient, private internetConnection: InternetConnectService) { }
}

veja que no segundo Service eu injeto o primeiro para antes verificar se tem rede e depois só usar um Service no component que por sí, vai verificar a rede e depois pegar os dados, faz sentido isso ?

3 respostas

Fala ai Dalcy, tudo bem? Eu não vejo problemas nesse tipo de situação.

Você basicamente precisa que um serviço notifique o outro.

Talvez, o que eu faria diferente é trabalhar com eventos.

Assim o dois serviços não precisam se conhecer.

A ideia é o seu serviço de conexão disparar um evento quando estiver online ou offline. E todos os serviços que dependerem da conexão podem se inscrever nesses eventos.

Espero ter ajudado.

Quando você fala de eventos, tá falando do Input Property e EventEmitter ?

solução!

Quando eu falo de eventos estou falando de um padrão pub/sub, algo desse tipo:

import { 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()
            }))
    }

}

É um serviço responsável por emitir e ouvir eventos, ele pode abstrair comunicações diretas como essa e escalar os listeners.

Espero ter ajudado.