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()
);
};
}
}