如何解决为什么需要订阅我的Observable?
我正在使用@ angular / mdc-web作为Material Design的包装器来进行Angular 8项目。今天,我不得不修复围绕错误对话框的错误。该对话框显示错误消息,可以单击“确定”按钮将其关闭。相当直截了当,在我实施该工具后的第二天,质量检查人员报告了一个问题缺陷之前,所有事情都起到了吸引作用。显然,关闭对话框后,某些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();
});
我什至无需取消订阅即可正常运行。我正在尝试了解Observable的工作方式。我会怀疑,一旦关闭对话框,便会调用 afterClosed ,类似于事件。为什么我必须订阅它?
非常感谢您的解释,欢呼。
解决方法
解释非常简单。 订阅时才发出可观察的东西。
此外,即使您不需要取消订阅也可以正常工作,为避免内存泄漏(如果它仍然发出,您仍将执行订阅回调),最好取消订阅。
, afterClosed
是一个函数。调用时会调用它。该函数返回一个可观察的热点。对话框结束关闭后,此Observable会发出一个项目。
运算符tap
,delay
和map
(与大多数运算符一样)仅在订阅时订阅其源。通过订阅最终的可观察者,您将触发一系列订阅。您可以想象这就像每个操作员都订阅了链中上方的操作员一样。
订阅热门观察者就像听演讲者一样。如果您不听,您将不会知道说话者说了什么,也无法采取行动。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。