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>