如何等待 FirebaseListObservable 的响应

Posted

技术标签:

【中文标题】如何等待 FirebaseListObservable 的响应【英文标题】:How to wait response of FirebaseListObservable 【发布时间】:2017-04-14 05:21:33 【问题描述】:

我一直在用 Angularfire2 制作一个 Angular2 应用程序。从 Firebase 检索数据时,我遇到了有关 FirebaseListObservable 的问题。这是我的代码。

this.requests = this._af.database.list('/requests');

此后不久,我记录了这个变量。

console.log(this.requests);

然后我得到一个未定义的,但我想等待此请求的响应,因为 this.requests 在此代码中始终未定义。我想让你教我如何等待 firebase 请求的结果。对不起我的英语不好。

【问题讨论】:

【参考方案1】:

list 方法返回一个 Observable,因此您可以订阅它以获取返回的请求。

  export class AppComponent 
    requests: FirebaseListObservable<any[]>;

    constructor(private af: AngularFire) 

    

    ngOnInit() 
      this.requests = this.af.database.list('/requests');

      this.requests.subscribe(
        (requests) => 
          console.log(requests)
        ,
        err => console.log(err)
      );
    
  

【讨论】:

谢谢,我还有一个问题。在 ngOnInit 中调用请求比在构造函数中调用更好吗?我了解到构造函数是在 ngOnInit 之前调用的。我总是无法决定使用哪个。如果你愿意,我希望你能回答这个问题。 @taku。这是一个很好的做法,请参阅this 线程了解更多信息。 谢谢!我会看到的。【参考方案2】:

由于从 Firebase 检索数据是异步的,因此您需要在请求的数据进入时“订阅”事件。重要的是在不再使用连接后关闭(取消订阅)连接以避免further problems。这可以通过以下代码实现:

this.requests = this._af.database.list('/requests')
  .subscribe(data => 
    data.forEach(obj => 
      console.log(obj.$key);
      console.log(obj.$value);
    );
    this.requests.unsubscribe();
);

如果你想保留连接,因为你正在更新你的数据,你应该省略this.requests.unsubscribe();,而是把

ngOnDestroy()
  this.requests.unsubscribe();

在您的组件中,因此当您的组件被销毁时连接会关闭。

【讨论】:

感谢您的评论。我不知道这种取消订阅方法,所以我将学习如何使用它来关闭连接。

以上是关于如何等待 FirebaseListObservable 的响应的主要内容,如果未能解决你的问题,请参考以下文章

主程序如何通过等待而不是加入同时等待多个线程?

如何让异步/等待等待我的嵌套数组填充

如何使用 QProcess 等待子进程?

颤振:如何使用“等待”等待其他 BLoC 事件完成

如何等待发货?

调用condition_variable等待函数时线程如何等待?