Kerwen
Kerwen

Reputation: 552

Error during add AsyncValidator in angular

I'm trying to add a new AsyncValidator to check whether user's email already exist in database. Below is may validator:

  export class UniqueEmailValidator implements AsyncValidator {
    constructor(private webService: WebWrapperService) {}

    validate(ctrl: AbstractControl): Promise < ValidationErrors | null > | Observable < ValidationErrors | null > {    
      return this.webService.isEmailExistEx(ctrl.value)
        .pipe(
          map(res => {    
            console.log("get response" + res);
            if (res) {
              return { 'uniqueEmail': true};
            }
            return null;                
          })

        );
    }
  }

The function isEmailExistEx in service will send a post request to server.

isEmailExistEx(email: string): Observable<boolean> {
    this.http.post(this.baseUrl + "auth/verify",
      {
        "email": email
      })
      .subscribe(
        (val: any) => {
          if (!val.result) {
            return of(false);
          } else {
            return of(true);
          }
        },
        response => {
          return of(false);
        },
        () => {
          return of(false);
        });
  }

It reports following error:

A function whose declared type is neither 'void' nor 'any' must return a value.

How should I modify this function?

Upvotes: 1

Views: 53

Answers (1)

SiddAjmera
SiddAjmera

Reputation: 39462

You're subscribeing to the Observable which will consume the value wrapped in it.

Use map instead of subscribeing and return a boolean value from it::

isEmailExistEx(email: string): Observable<boolean> {
  return this.http.post(this.baseUrl + "auth/verify", { email })
  .pipe(
    map((val: any) => val.result ? true : false)
  );
}

Upvotes: 1

Related Questions