为什么我需要订阅我的 Observable?

Why do I need to subscribe to my Observable?

我正在开发一个 Angular 8 项目,使用 @angular/mdc-web 作为 Material 设计的包装器。今天我不得不修复一个围绕错误对话框的错误。该对话框显示一条错误消息,可以通过单击“确定”按钮关闭。非常简单,一切都很好,直到我在实施后的第二天收到 QA 人员报告的问题缺陷。显然,一些 UI 元素(按钮)在对话框关闭后停止工作。

为了检查错误,我订阅了应用程序中央 openDialog 函数返回的 Observable,突然间错误不再出现。下面是openDialog函数的相关代码:

const dialogRef: MdcDialogRef<T> = this.dialog.open(
  // irrelevant stuff ommitted
);

return dialogRef.afterClosed().pipe(
  tap(
    () =>
      (this.dialogRefArray = this.dialogRefArray.filter(
        item => item.id !== data.id
      ))
  ),
  delay(500),
  tap(() => this.navigationBlocker.unregister(data.id)),
  map(resultFn)
);

现在,我对 Rxjs 比较陌生,我的问题是:为什么 afterClosed 只在我订阅后才被调用?像这样:

const dialog = this.dialogService.openDialog(
  // irrelevant stuff ommitted
).subscribe(() => {
  dialog.unsubscribe();
});

我什至不需要退订就可以使用。我试图了解 Observables 是如何工作的。我会怀疑 afterClosed 在对话框关闭时被调用,类似于事件。为什么我必须订阅它?

非常感谢解释,干杯。

解释很简单。 一个 observable 只在你订阅它时发出。

此外,即使您不需要取消订阅也能正常工作,取消订阅以避免内存泄漏是个好习惯(如果它仍然发出,您仍将执行订阅回调)。

afterClosed 是一个函数。当你调用它时它被调用。此函数 returns 是一个热门的可观察对象。当对话框完成关闭时,这个 observable 发出一个项目。

运算符 tapdelaymap(与大多数运算符一样)仅在订阅时订阅它们的来源。通过订阅最终的可观察对象,您会触发一系列订阅。你可以想象这就像每个操作员都订阅了链中上面的操作员。

订阅热门 Observable 就像听演讲一样。如果你不去听,你就不知道演讲者说了什么,也无法付诸行动。