首页 文章

Angular2通过订阅返回true / false

提问于
浏览
2

我需要检查数据库中是否存在用户,如果是,则返回true . 我有一个功能(我顺便使用firebase):

checkIfUserExists(login: string): boolean {
    this.af.database.list('/users', {
      query: {
        orderByChild: 'login',
        equalTo: login
      }
    }).subscribe(response => {
      if(response.length === 0 ) return true
    })
    return false
  }

问题是该函数总是返回false . 它不等待检查订阅 . 有没有办法解决它?

3 回答

  • 0

    您可以返回一个承诺,然后调用 find()

    checkIfUserExists(login: string): boolean {
        return this.af.database.list('/users', {
          query: {
            orderByChild: 'login',
            equalTo: login
          }
        }).subscribe(response => {
          if(response.length === 0 )
            return true;
           return false;
        }).toPromise().find();
    
      }
    
  • 2

    你可以返回observable本身:

    checkIfUserExists(login: string): Observable<boolean> {
        return this.af.database.list('/users', {
          query: {
            orderByChild: 'login',
            equalTo: login
          }
        }).map(response => {
          if(response.length === 0 ) {
            return true;
          } else {
            return false;
          }
        });        
      }
    

    在这种情况下,您可以像这样使用它:

    checkIfUserExists('some username')
         .subscribe(userExists => {
           // Do something
         });
    

    这是因为您的处理是异步的,因此您需要使用回调处理处理 . 这样,您将确保在执行异步处理时执行处理 .

    您可以使用observables(rxjs - 就像我的样本一样)或承诺用于此类用例 .

  • 0

    您可以使用Native Promise API返回承诺:

    checkIfUserExists(login: string): boolean {
      return new Promise(function(resolve, reject) {
        this.af.database.list('/users', {
          query: {
            orderByChild: 'login',
            equalTo: login
          }
        }).subscribe(response => {
          if(response.length === 0 ) {
            reject();
          } else {
            resolve()
          }
        })
      });
    }
    

    然后用它,

    checkIfUserExists('login').then(function(response) {
      // found
    }, function() {
      // not found
    });
    

相关问题