2017-10-17 3 views
0

Ich verfüge über einen benutzerdefinierten Validator, der überprüft, ob die E-Mail eines Benutzers eindeutig ist oder nicht.Angular Custom Async Validator bleibt im Status "Ausstehend"

Ich habe zu verwandtem Thema auf Stackoverflow und Internet gesucht, aber keine Hilfe

wenn ich Eingabe in Form geben werde (die Anfrage zu senden), die Anforderung bleibt im Zustand anhängig und Entschlüsse doesnot.

Ich habe das Backend im Postboten getestet, es funktioniert wie erwartet, das Problem ist bei Client oder eckige Seite.

Die Funktion Validation ist wie folgt:

emailUniqueValidator (control: AbstractControl): Promise<{[key: string]: any}> | Observable<{[key: string]: any}> { 
    return new Promise((resolve, reject) => { 
     this.userService.checkEmailUnique(control.value).subscribe((response: Response) => { 
     const body = response.json(); 
     if (body.found === false) { 
      resolve(null); // email is unique 
     } else { 
      reject({emailUniqueValidator: true}); // email is not unique 
     } 
     }); 
    }); 
    } 

Wenn ich die Wert der Formsteuerung zu ändern bin, die anstehende Klasse erscheint, aber es klebt in immer statt gelöst zu werden.

Ich habe die E-Mail-Formular-Steuerelement wie folgt:

'email': new FormControl('', [ 
     Validators.required, 
     Validators.email 
     ], this.emailUniqueValidator.bind(this) 
), 

Und mein User-Dienst ist wie folgt:

checkEmailUnique (email: string): Observable<Response> { 
    return this.http.post('http://localhost:3000/user/email', {email}, { withCredentials: true }); 
    } 

Warum Der Validator nicht rechtzeitig aufgelöst wird, und bleiben für immer anhängig?

EDIT:

Der folgende Code wird von der Service ganz gut bekommen Wert, ich es, indem Sie die Antwort in die Konsole eingecheckt haben.

Wenn die E-Mail nicht in der Datenbank vorhanden ist, wird sie problemlos gelöst, aber wenn die E-Mail bereits vorhanden ist, wird ein Fehler ausgegeben und der Status bleibt ausstehend.

return new Promise((resolve, reject) => { 
     this.userService.checkEmailUnique(control.value).subscribe((response: Response) => { 
     console.log(response); 
     response.json().found ? reject({emailUniqueValidator: true}) : resolve(null); 
     }, (error: any) => reject({emailUniqueValidator: true})); 
}); 

Antwort

0

Warum gehen Sie durch das Versprechen, einen beobachtbaren Kopfschmerz einzuwickeln? versuchen Sie es wie folgt:

emailUniqueValidator (control: AbstractControl): Observable<{[key: string]: any}> { 
    return this.userService.checkEmailUnique(control.value) 
       .map(r => r.json()) 
       .map(r => (r.found) ? {emailUniqueValidator: true} : null); 
} 
+0

Ich habe versucht, Ihren Code, aber der Staat steht noch aus, können Sie sagen, warum ist das passiert? –

+0

sollten Sie den do() -Operator verwenden, um zu debuggen, sehen, wenn irgendetwas jemals durchkommt, sollte dies funktionieren, ein Problem ist woanders. – bryan60

Verwandte Themen