Валидаторы для проверки взятых имен пользователей не работают должным образом - PullRequest
0 голосов
/ 02 августа 2020

Итак, у меня есть этот валидатор:

takenUsername(control: FormControl): Promise<any> | Observable<any> {
    const promise = new Promise<any>((resolve, reject) => {
      let text$ = fromEvent(this.userName.nativeElement, "keyup")
        .pipe(
          debounceTime(200),
          distinctUntilChanged(),
          switchMap(() => this.employeeService.getEmployeeList())
        )
        .subscribe((employees) => {
          if (employees.length === 0) {
            resolve(null);
          }
          const properties = employees.map((employee) => employee.userName);
          for (let tempProperty of properties) {
            if (tempProperty === control.value) {
              resolve({ usernameIsTaken: true });
            } else {
              resolve(null);
            }
          }
        });
    });
    return promise;
  }

По какой-то причине он проверяет только первый элемент, который у меня есть в коллекции. Я знаю, что logi c в других местах работает, потому что, если я удалю все объекты и добавлю некоторые снова, только первый из них будет сопоставлен как взятый. на других нет.

Я попытался вставить файл console.log:

const properties = employees.map((employee) => employee.userName);
          for (let tempProperty of properties) {
            console.log("temp property is " + tempProperty)
            console.log("control value is " + control.value)
            if (tempProperty === control.value) {
              resolve({ usernameIsTaken: true });
            } else {
              resolve(null);
            }

Результат:

контрольное значение ciao

свойство temp - l

значение элемента управления - ciao

свойство temp - ciao

значение элемента управления - ciao

свойство temp - dasd

контрольное значение - ciao

Итак, «ciao» не является первым элементом в таблице, поэтому я не получаю никаких ошибок. Если я попробовал с первым, этот logi c, похоже, работает и устраняет ошибку usernameIsTaken

1 Ответ

0 голосов
/ 02 августа 2020

Ваш l oop никогда не завершается, потому что созданное вами Обещание разрешается с помощью null, как только оно находит имя пользователя, которое не занято. Я также посоветовал бы поддерживать цепочку Observable на всем протяжении и не использовать обещания. Примерно так:

takenUsername(control: FormControl): Observable<any> {
  return fromEvent(this.userName.nativeElement, "keyup").pipe(
  debounceTime(200),
  distinctUntilChanged(),
  switchMap(() => this.employeeService.getEmployeeList()),
  map(employees => {
    const foundEmployee = employees.find(employee => employee.userName === control.value);
    if (foundEmployee) {
      return { usernameIsTaken: true };
    } else {
      return null;
    }
  })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...