3

我需要检查用户是否存在于数据库中,如果存在则返回 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。它不等待检查订阅。有什么办法可以解决吗?

4

3 回答 3

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)或 Promise。

于 2016-07-17T21:11:47.297 回答
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();

  }
于 2016-07-17T03:09:10.587 回答
0

你可以使用 Native Promise API 返回一个 Promise:

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
});
于 2016-07-17T08:15:36.227 回答