当我希望使用rxjs从firebaselistobservable中提取一个对象时,我是否仍应使用subscribe?

当我希望使用rxjs从firebaselistobservable中提取一个对象时,我是否仍应使用subscribe?,firebase,firebase-realtime-database,rxjs,Firebase,Firebase Realtime Database,Rxjs,我有点搞不清楚哪些方法属于什么时候使用它们 现在,我正在使用subscribe来处理基本上所有的事情,但当我想要从Firebase中快速获得一个静态值时,它并不适用于我。你能解释一下什么时候我应该使用subscribe而不是其他方法来进行严格的观察吗?当使用异步值时,你有几个选项:承诺,rxjs,回调。每种选择都有自己的缺点 当您想要检索单个异步值时,出于简单性考虑,很容易使用承诺(.then(myVal=>{}))。但这并不能让您访问超时/节流/重试行为等内容。Rx流,即使是单个值,也会为您提

我有点搞不清楚哪些方法属于什么时候使用它们


现在,我正在使用subscribe来处理基本上所有的事情,但当我想要从Firebase中快速获得一个静态值时,它并不适用于我。你能解释一下什么时候我应该使用subscribe而不是其他方法来进行严格的观察吗?

当使用异步值时,你有几个选项:
承诺
rxjs
回调
。每种选择都有自己的缺点

当您想要检索单个异步值时,出于简单性考虑,很容易使用承诺(
.then(myVal=>{})
)。但这并不能让您访问超时/节流/重试行为等内容。Rx流,即使是单个值,也会为您提供这些选项

所以我的建议是,即使你想要一个单一的值,也要使用可观测值。“远程数据库中的快速静态值”没有异步选项

如果您不想使用
.subscribe()
方法,还有其他选项可以让您激活订阅,如
.toPromise()
,这可能更容易使用Rx检索单个值

const getMyObjPromise = $firebase.get(myObjId)
  .timeout(5000)
  .retry(3)
  .toPromise()

getMyObjPromise.then(obj => console.log('got my object'));

我的猜测是,你有一个subscribe方法,它包含一堆逻辑,就像一个“.then”一样,然后你把结果保存到某个局部变量中

首先:尽量避免订阅方法中的任何逻辑->在此之前使用流操作符,然后订阅只是为了检索数据。 您可以更灵活地使用它,并且单元测试流中的单个部分比测试整个组件本身要容易得多

第二:尽量避免使用手动订阅-在angular Controller中,如果不取消订阅,很容易导致内存泄漏。
在模板中使用异步管道,让angular自己管理订阅。

谢谢,这让我了解了更多