3
respostas

Subject com mensagem atrasada

Bom dia a todos. Vou tentar resumir. Criei um serviço de mensagem com Subject, declarei no construtor de minha classe(extends ErrorHandler) que intercepta erros e produz a mensagem, no login também declarei a classe do serviço que consome a mensagem, porém a mensagem não é renderizada na hora do logar, somente a segunda tentativa de login exibe a primeira tentativa e assim sucessivamente. Esse comportamento parece um delay no consumo. Não sei como resolver, quem puder ajudar eu agradeço muito. Obs: Em outras duas aplicações diferentes, porém seguindo a mesma infra de mensagens, tive o mesmo problema. Ainda bem que é tudo aplicação minha mesmo, senão estaria cortando os pulsos. /o\

Meu Service:

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

  private subject = new Subject<any>();

  constructor() { }

  sendMessage(message: string) {
    console.log('chegou mensagem NO SERVICE: ' + message);
    this.subject.next(message);
  }

  clearMessge() {
    this.subject.next();
  }

  getMessage() {
    return this.subject.asObservable();
  }

}

Meu ErrorHandler:

@Injectable({
  providedIn: 'root'
})
export class AppErrorHandlerService extends ErrorHandler {

  private cont: number;

  static count : number = 0;

  constructor(private msgService: MessageService) {
    super();
  }


  handleError(errorResponse: Error ) {

    if (errorResponse instanceof HttpErrorResponse) {

      const message = errorResponse.error.message;

       switch (errorResponse.status) {
        case 401:
            console.log('(CHEGOU NO ERROR-HANDLER) 401: ' + message || 'Acesso negado. Efetue login.');
            this.msgService.sendMessage('(PRODUZINDO MENSAGEM)401: ' + message || 'Acesso negado. Efetue login.');
            break;
        case 403:
            console.log('403: ' + message || 'Você não tem acesso e esse modulo/funcionalidade.');
            this.msgService.sendMessage(message);
            break;
        case 404:
            console.log('404: ' + (message === 'No message available' ? 'Página não encontrada' : message) || 'Página não encontrada.');
            this.msgService.sendMessage(message);
            break;
        case 500:
          console.log('500: ' + message || 'Erro no servidor. Contate o administrador.');
            this.msgService.sendMessage(message);
            break;
        case 0: console.log('0 (backend fora): ' + message || 'Sem comunicação com o servidor. Contate o administrador.');
            this.msgService.sendMessage('0 (backend fora): ' +  AppErrorHandlerService.count++ || 'Sem comunicação com o servidor. Contate o administrador.');
            break;
      }

    } else {
      console.log('Outro erro: ' + errorResponse);
    }
    super.handleError(errorResponse);
  }
}

Meu login:

export class LoginComponent implements OnInit, OnDestroy {

    subscription: Subscription;
    message: any;
    loginForm: FormGroup;
    user: Usuario;


    constructor(private translate: TranslateService,
                private cookieService: CookieService,
                public router: Router,
                private authService: AuthService,
                private fb: FormBuilder,
                private current: CurrentUserService,
                private msgService: MessageService
    ) {
        this.current.logout();

        this.subscription = this.msgService.getMessage().subscribe(
            (msg) => {
              this.message = JSON.stringify(msg);
              console.log('OUVIU A MENSAGEM: ' + msg );
            }
          );

    }

    ngOnDestroy() {
        // unsubscribe to ensure no memory leaks
        this.subscription.unsubscribe();
    }
}

<div *ngIf="message" class="alert alert-success"><label style="color:red;">{{message}}</label></div>
3 respostas

Fala aí Ronaldo, beleza? Testei seus Service's e aqui deu tudo certo, as mensagens foram mostradas no momento e hora certa.

Consegue compartilhar o projeto? Ficaria mais fácil para dar uma olhada.

Espero ter ajudado.

Olá Mateus, eu tenho outro projeto no GITHUB com o mesmo problema, esse projeto eu fiz para eu e meus amigos estudarem, lá também tem o mesmo problema, mas estava com outro código, então fiz os ajustes para ser igual ao que postei aqui. Esse projeto é interessante, se você quiser participar ou efetuar mudanças nele fique a vontade, eu vou gostar muito. Esse é o link: https://github.com/ronaldoar/pitstoppark-project.git

Muito obrigado!

insira seu código aqui

Vou tentar dar uma olhada, vai demorar um pouquinho mas eu tento ver o quanto antes Ronaldo.

Espero ter ajudado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software