testes/Modulos Angular/projects/idt_app/docs/architecture/LOOP_PREVENTION_GUIDE.md

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

  1. DevTools Network Tab: Verificar se as requisições driver?page=1&limit=10& não estão mais em loop
  2. Console: Monitorar se aparecem warnings de prevenção de loop
  3. Performance: Verificar se a CPU não está mais sobrecarregada

Causas Prováveis do Loop Original

  1. Ciclo de Vida Duplicado: O componente estava sendo inicializado múltiplas vezes
  2. Detecção de Mudanças: O Angular pode ter entrado em loop de detecção de mudanças
  3. Subscription não controlada: Observables podem ter causado chamadas em cascata
  4. Tab System: Interação problemática entre tabs e o sistema de dados

Testagem

Para testar se a correção funcionou:

  1. Abrir a página de drivers
  2. Verificar o DevTools → Network tab
  3. Confirmar que apenas 1 requisição inicial é feita
  4. Testar paginação, filtros e ordenação para verificar chamadas controladas
  5. 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