Angular 正在自定义验证程序中等待http请求

Angular 正在自定义验证程序中等待http请求,angular,http,Angular,Http,我为我的模板驱动表单制作了一个自定义验证器,以检查数据库中是否已经存在用户名,但由于http请求是异步的,所以我的函数总是返回null 是否有一种方法可以等待getUser()函数结束并在返回它之前将isValid字段设置为false function validateUSERNAMEFactory(userService: UserService) : ValidatorFn { return (c: AbstractControl) => { var user

我为我的模板驱动表单制作了一个自定义验证器,以检查数据库中是否已经存在用户名,但由于http请求是异步的,所以我的函数总是返回null

是否有一种方法可以等待getUser()函数结束并在返回它之前将isValid字段设置为false

function validateUSERNAMEFactory(userService: UserService) : ValidatorFn {
    return (c: AbstractControl) => {

        var user:User[];
        var isValid = true;

        userService.getUsers().subscribe((data: User[])=>{
            user = data;
            for(let u of user){
                if(u.korIme===c.value) isValid = false;
            }
          });

        if(isValid) {
            return null;
        } else {
            return {
                korIme: {
                    valid: false
                }
            };
      }
    }
}
来自服务类的代码:

  getUsers(){
    return this.http.get(`${this.url}/home`);
  }
我的指令类:

  export class USERNAMEValidator implements Validator { 
    validator: ValidatorFn;

    constructor(private userService: UserService) {
        this.validator = validateUSERNAMEFactory(this.userService);
      }

    validate(c: FormControl) {
        return this.validator(c);
    }

   }

请考虑。该代码当前返回值,而不等待服务调用的响应。您应该将您的条件设置为在订阅范围内。正如@R.Richards提到的,异步验证器是这个场景的标准。如果您不熟悉如何将自定义异步确认器链接到表单控件,这里有另一个链接。该代码当前返回一个值,而不等待服务调用的响应。您应该将您的条件设置为在订阅范围内。正如@R.Richards提到的,异步验证器是这个场景的标准。如果您不熟悉如何将自定义异步验证器链接到表单控件,那么这里有另一个链接