toPromise()是否取消订阅Observable?

时间:2019-12-19 01:58:59

标签: rxjs

我找不到任何规范性文本来回答这个问题。我一直在使用此代码模式(在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运算符 然后完成。

1 个答案:

答案 0 :(得分:2)

无需退订。

这很方便,因为没有办法取消承诺。

  • 如果Observable完成,则诺言将resolve发送最后的值,此时所有订阅者将自动取消订阅。

  • 如果出现可观察到的错误-诺言将reject,并且此时所有订阅者将自动取消订阅。

但是,toPromise有一些极端情况,其行为从the docs尚不能完全清楚。

  1. 如果Observable发出一个或多个值,但未完成或出错,则Promise既不会解决也不会拒绝。在这种情况下,promise会在内存中徘徊,在使用toPromise时值得考虑。

  2. 如果Observable完成但未发出值,则诺言将resolveundefined一起使用。