Angular2使用订阅

时间:2016-07-17 01:30:59

标签: asynchronous angular angularfire2

我需要检查数据库中是否存在用户,如果是,则返回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 :(得分: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 - 就像我的样本一样)或承诺这样的用例。

答案 1 :(得分: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 :(得分: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
});