3
respostas

Validação assíncrona - requests excessivos para o backend

Prezados, boa tarde.

Da forma que foi implementada a validação assíncrona, notei que ocorre uma chamada para o backend para cada letra digitada no campo de usuário. Além disso, mesmo que já tenha ocorrido o erro de validação de letras maiúsculas, a chamada continua ocorrendo.

Fiz algumas alterações na implementação para minimizar essa quantidade de chamadas. Acho que seria interessante colocar um tópico extra explicando esses pontos.

import { AbstractControl } from '@angular/forms';
import { NovoUsuarioService } from './novo-usuario.service';
import { Injectable } from '@angular/core';
import { debounceTime, first, map, of, switchMap } from 'rxjs';

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

  constructor(private NovoUsuarioService: NovoUsuarioService) { }

  usuarioJaExiste() {
    return (control: AbstractControl) => {

      //Verifica, inicialmente, 
      //se já não existe um outro erro para o mesmo campo, evitando uma chamada desnecessária
      if (control.errors != null) {
        return of(null);
      }

      return control.valueChanges.pipe(
        // Esta função da biblioteca rxjs cria um 'delay' em MS antes de prosseguir.
        // Desta forma, o programa esperará 500ms até a útima digitação do usuário antes de prosseguir
        // Com a chamada ao backend.
        debounceTime(500), 
        switchMap((nomeUsuario) => this.NovoUsuarioService.verificarUsuarioExistente(nomeUsuario)),
        map((usuarioExiste) => usuarioExiste ? { usuarioExistente: true} : null),
        first()
      );
    };
  }
}
3 respostas

Pensei a mesma coisa enquanto implementava o código. Como sou mais do backend e não tenho conhecimento dos recursos do rxjs, provavelmente eu iria fazer alguma "gambiarra" pra resolver esse problema no front. Obrigado pela colaboração :D

Concordo, pensei a mesma coisa. Pra quem trabalha com backend ja deve ter tido varias dores de cabeça com excesso de consultas e chamadas excessivas ao banco. Valeu por compartilhar

Olá Daniel,

Obrigada por compartilhar seu conhecimento aqui no fórum! :)

Para quem tiver interesse em saber mais, o professor Flávio aborda sobre esta questão de melhoria de performance e explica o padrão debounce neste aula.

Bons estudos galera!