我找不到任何规范性文本来回答这个问题。我一直在使用此代码模式(在Angular应用程序的TypeScript中):
observeSomethingFun$: Observable<Fun>;
...
async loadsOfFun() {
const fun = await this.observeSomethingFun$.toPromise();
// I now have fun
}
事实证明,需要取消订阅我的Observable。使用Angular async
管道时,这会自动发生,但是在这种情况下会发生什么? toPromise
发出一个值后是否退订?
如果没有,我如何手动退订?
更新:
事实证明,@ Will Taylor下面的回答是正确的,但我的问题需要澄清。
在我的情况下,Observable发出永无休止的流,这与Angular的 HttpClient Observables不同,后者在发出一个值后完成。所以
就我而言,根据泰勒的回答,我永远不会超越await
语句。
RxJS使此问题易于修复。正确的语句证明是:
const fun = await this.observeSomethingFun$.pipe(first()).toPromise();
RxJS first
运算符将接收第一个值,并从源Observable退订。然后它将该值发送给toPromise
运算符
然后完成。
答案 0 :(得分:2)
无需退订。
这很方便,因为没有办法取消承诺。
如果Observable完成,则诺言将resolve
发送最后的值,此时所有订阅者将自动取消订阅。
如果出现可观察到的错误-诺言将reject
,并且此时所有订阅者将自动取消订阅。
但是,toPromise
有一些极端情况,其行为从the docs尚不能完全清楚。
如果Observable发出一个或多个值,但未完成或出错,则Promise既不会解决也不会拒绝。在这种情况下,promise会在内存中徘徊,在使用toPromise
时值得考虑。
如果Observable完成但未发出值,则诺言将resolve
与undefined
一起使用。