首页 > 解决方案 > 订阅之外未定义的布尔值?

问题描述

我有一个以布尔检查结束的 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;
  }

如果我传递了一封现有的电子邮件,我得到了正确的值,但如果我传递了一个不在数据库中但我首先得到错误值的电子邮件,那么如果我再次触发它,那么该值再次正常。

标签: angulartypescriptobservablesubscribe

解决方案


如果您不订阅异步操作,则不能保证您的标志已经分配到代码中的任何位置。

我要做的是将布尔标志更改为主题:

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

推荐阅读