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

オブザーバブル自体を返すことができます:

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

これは、処理が非同期であるため、コールバックで処理を処理する必要があるためです。これにより、非同期処理を実行する際に確実に処理を実行することができます。

そのようなユースケースでは、オブザーバブル (rxjs - 私のサンプルのように) またはプロミスのいずれかを使用できます。

于 2016-07-17T21:11:47.297 に答える
0

代わりに promise を返してから呼び出すことができます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 に答える