Asynchronous Angular2随订阅返回真/假

Asynchronous Angular2随订阅返回真/假,asynchronous,angular,angularfire2,Asynchronous,Angular,Angularfire2,我需要检查数据库中是否存在用户,如果存在,则返回true。我有一个函数(顺便说一下,我正在使用firebase): 问题是函数总是返回false。它不等待检查订阅。有什么方法可以修复它吗?您可以返回一个承诺,然后调用find(): 您可以使用本机承诺API返回承诺: checkIfUserExists(login: string): boolean { return new Promise(function(resolve, reject) { this.af.database.li

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


问题是函数总是返回false。它不等待检查订阅。有什么方法可以修复它吗?

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


您可以使用本机承诺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
});

您可以返回可观察对象本身:

  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;
      }
    });        
  }
这是因为您的处理是异步的,所以您需要使用回调处理处理。这样,当执行异步处理时,您将确保执行处理


您可以在此类用例中使用Observable(与我的示例中类似的rxjs)或Promise。

您的“返回false”不在。subscribe块
属性“toPromise”在类型“Subscription”上不存在。
属性“subscribe”在类型“boolean”上不存在。将返回类型修复为
Observable
。还缺少
返回
checkIfUserExists('login').then(function(response) {
  // found
}, function() {
  // not found
});
  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
     });