toPromise() 是否取消订阅 Observable?

Ala*_*ect 8 rxjs

我找不到任何规范文本来回答这个问题。我一直在使用这种代码模式(这是在 Angular 应用程序中的 TypeScript 中):


observeSomethingFun$: Observable<Fun>;
    ...
async loadsOfFun() {
  const fun = await this.observeSomethingFun$.toPromise();
    // I now have fun
}

Run Code Online (Sandbox Code Playgroud)

一般来说,Observables 需要取消订阅。async使用Angular管道时会自动发生这种情况,但在这种情况下会发生什么?toPromise发出一个值后是否取消订阅?

如果没有,我如何手动取消订阅?

更新:

事实证明@Will Taylor 下面的回答是正确的,但我的问题需要澄清一下。

在我的例子中,Observable 发出一个永无止境的流,这与 Angular 的HttpClient Observables 不同,它在发出一个值后完成。因此,在我的情况下,await根据泰勒的回答,我永远不会通过声明。

RxJS 使这个问题很容易解决。正确的说法是:

const fun = await this.observeSomethingFun$.pipe(first()).toPromise();
Run Code Online (Sandbox Code Playgroud)

RxJSfirst操作符将接收第一个值并取消订阅源 Observable。然后它会将该值发送给toPromise操作员,然后完成。

Wil*_*lor 6

无需取消订阅。

这很方便,因为无法取消订阅承诺。

  • 如果 Observable 完成 - 承诺将resolve发出最后一个值,此时所有订阅者将自动取消订阅。

  • 如果 Observable 错误 - 承诺将reject在此时自动取消订阅所有订阅者。

但是,在一些边缘情况下,文档中toPromise的行为并不完全清楚。

  1. 如果 Observable 发出一个或多个值但没有完成或出错,则承诺既不会解决也不会拒绝。在这种情况下,promise 会留在内存中,这在使用toPromise.

  2. 如果 Observable 完成但不发出值,则承诺将resolve使用undefined.