2017-10-17 138 views
0

我有一個自定義驗證器,用於驗證用戶的電子郵件是否唯一。角度自定義異步驗證器保持待定狀態

我搜索過的計算器上和互聯網相關的話題,但沒有幫助當我給輸入表單(發送請求)

,請求停留在未決狀態和亙古不變的緩解。

我測試過postman後端,它按預期工作,問題出在客戶端或角度端。

的驗證功能如下:

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

當我改變表單控件的值,出現未決類,但它堅持天長地久,而不是得到解決。

我有電子郵件的形式控制如下:

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

我的用戶服務如下:

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

爲什麼驗證器沒有及時解決和保持未決下去嗎?

編輯:

下面的代碼是從服務蠻好中獲得價值,我已經通過登錄響應到控制檯檢查它。

如果電子郵件不存在於數據庫中,那麼它已經得到解決了,但是如果電子郵件已經存在,它將引發錯誤並且狀態保持懸而未決。

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

回答

0

爲什麼你要通過承諾包裝可觀察到的頭疼?嘗試它是這樣的:

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

我試過你的代碼,但狀態仍然懸而未決,你能告訴爲什麼會發生這種情況? –

+0

你應該使用do()運算符進行調試,看看是否有任何事情能夠通過,這應該起作用,有些問題在其他地方。 – bryan60