2017-10-17 93 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