3.7 KiB
3.7 KiB
🛡️ Guia de Prevenção de Loop Infinito - BaseDomainComponent
Problema Identificado
O componente de drivers estava causando um loop infinito nas requisições da API getDrivers(), conforme evidenciado pelo DevTools mostrando centenas de chamadas consecutivas em poucos segundos.
Medidas de Proteção Implementadas
1. Controle de Inicialização
private _isInitialized = false;
private _setupDomainCalled = false;
ngOnInit() {
if (this._isInitialized) {
console.warn('[BaseDomainComponent] Tentativa de re-inicialização bloqueada');
return;
}
// ... resto da inicialização
this._isInitialized = true;
}
2. Prevenção de Setup Duplicado
private setupDomain(): void {
if (this._setupDomainCalled) {
console.warn('[BaseDomainComponent] setupDomain já foi executado, evitando duplicação');
return;
}
this._setupDomainCalled = true;
// ... configuração do domínio
}
3. Proteção Dupla para loadEntitites()
private _isLoadingEntities = false;
private _lastLoadTime = 0;
loadEntities(currentPage = this.currentPage, itemsPerPage = this.itemsPerPage) {
const now = Date.now();
// Proteção 1: Verificar se já está carregando
if (this.isLoading || this._isLoadingEntities) {
console.warn('[BaseDomainComponent] Tentativa de carregamento rejeitada - já está carregando');
return;
}
// Proteção 2: Evitar chamadas muito frequentes (< 100ms)
if (now - this._lastLoadTime < 100) {
console.warn('[BaseDomainComponent] Tentativa de carregamento rejeitada - chamada muito frequente');
return;
}
this._lastLoadTime = now;
this.isLoading = true;
this._isLoadingEntities = true;
// ... requisição da API
}
4. Controle de Detecção de Mudanças
// Forçar detecção de mudanças de forma controlada
this.cdr.detectChanges();
Logs de Monitoramento
As seguintes mensagens de warning aparecerão no console se houver tentativas de loop:
[BaseDomainComponent] Tentativa de re-inicialização bloqueada[BaseDomainComponent] setupDomain já foi executado, evitando duplicação[BaseDomainComponent] Tentativa de carregamento rejeitada - já está carregando[BaseDomainComponent] Tentativa de carregamento rejeitada - chamada muito frequente
Monitoramento Recomendado
- DevTools Network Tab: Verificar se as requisições
driver?page=1&limit=10&não estão mais em loop - Console: Monitorar se aparecem warnings de prevenção de loop
- Performance: Verificar se a CPU não está mais sobrecarregada
Causas Prováveis do Loop Original
- Ciclo de Vida Duplicado: O componente estava sendo inicializado múltiplas vezes
- Detecção de Mudanças: O Angular pode ter entrado em loop de detecção de mudanças
- Subscription não controlada: Observables podem ter causado chamadas em cascata
- Tab System: Interação problemática entre tabs e o sistema de dados
Testagem
Para testar se a correção funcionou:
- Abrir a página de drivers
- Verificar o DevTools → Network tab
- Confirmar que apenas 1 requisição inicial é feita
- Testar paginação, filtros e ordenação para verificar chamadas controladas
- Verificar se não há warnings no console
Impacto na Performance
✅ Antes: Centenas de requisições por segundo
✅ Depois: 1 requisição inicial + chamadas controladas apenas quando necessário
Essas proteções garantem que:
- O componente seja inicializado apenas uma vez
- As requisições sejam feitas de forma controlada
- O sistema seja resiliente a problemas de ciclo de vida
- A performance seja otimizada