angular - 订阅之外未定义的布尔值?
问题描述
我有一个以布尔检查结束的 API 调用。我想创建新用户,但如果数据库中存在电子邮件,我想设置canAddUser = false。我执行以下操作:
canAddUser: boolean;
setNewUserValues() {
if (this.formUser.email) {
this.checkExistingEmail();
}
}
checkExistingEmail() {
this.userService.findPrivilegedUsersUsingGET().subscribe(users => {
const mailIndex = users.findIndex(user => user.email === this.formUser.email);
mailIndex !== -1 ? this.canAddUser = false : this.canAddUser = true;
console.log(this.canAddUser);
});
}
如果我将布尔值记录到我当前正在执行的控制台中,我会得到正确的值。但是,如果我在其他地方记录它,它首先是未定义的!然后,如果我触发触发setNewUserValues()的按钮,它将再次获得正确的值。我错过了什么这么严重?
编辑
某种程度上解决了我的问题。
setNewUserValues() {
if (this.formUser.email) {
this.checkExistingEmail();
}
}
checkExistingEmail() {
this.userService.findPrivilegedUsersUsingGET().subscribe(users => {
this.mailIndex = users.findIndex(user => user.email === this.formUser.email);
});
this.validateEmail(this.mailIndex);
console.log(this.canAddUser);
}
private validateEmail(index: number) {
index !== -1 ? this.canAddUser = false : this.canAddUser = true;
}
如果我传递了一封现有的电子邮件,我得到了正确的值,但如果我传递了一个不在数据库中但我首先得到错误值的电子邮件,那么如果我再次触发它,那么该值再次正常。
解决方案
如果您不订阅异步操作,则不能保证您的标志已经分配到代码中的任何位置。
我要做的是将布尔标志更改为主题:
canAddUser$: Subject<boolean>;
在需要时发出值:
mailIndex !== -1 ? this.canAddUser$.next(false): this.canAddUser$.next(true);
// this.canAddUser$.next(mailIndex === -1);
当你需要它时,订阅它:
someFunction() {
this.canAddUser$.subscribe(canAdd => {
// Here *canAdd* is a boolean
})
}