【问题标题】:Angular2 return true/false with subscriptionAngular2通过订阅返回真/假
【发布时间】:2016-11-19 21:42:20
【问题描述】:

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

【问题讨论】:

  • 您的“return false”在 .subscribe 块之外

标签: asynchronous angular angularfire2


【解决方案1】:

您可以改为返回一个承诺,然后调用 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();

  }

【讨论】:

  • Property 'toPromise' does not exist on type 'Subscription'
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你可以返回 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。

    【讨论】:

    • Property 'subscribe' does not exist on type 'boolean'.
    • 将返回类型修复为Observable&lt;boolean&gt;。 return 也不见了。
    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 2012-07-17
    相关资源
    最近更新 更多