Angular 茉莉花没有’;调用unsubscribe后,t继续执行subscribe回调中的代码

Angular 茉莉花没有’;调用unsubscribe后,t继续执行subscribe回调中的代码,angular,testing,jasmine,Angular,Testing,Jasmine,我用过这些stackblitz: 我已经融入其中: 该示例可以在对话框示例stackblitz中执行,在main.ts中将测试变量设置为false,因此可以检查预期行为是否已完全填充:关闭对话框后,dialogIsOpen变量为false 在测试期间,我模拟了该对话框,因此afterClose事件在中间被触发,但是unsubscribe调用之外的代码没有被执行。这可以通过更改取消订阅呼叫进行检查,并放在对话框isopen=false之后行。然后执行该行,但不执行函数的其余部分 这是虫子吗?

我用过这些stackblitz:

我已经融入其中:

该示例可以在对话框示例stackblitz中执行,在main.ts中将测试变量设置为false,因此可以检查预期行为是否已完全填充:关闭对话框后,dialogIsOpen变量为false

在测试期间,我模拟了该对话框,因此afterClose事件在中间被触发,但是unsubscribe调用之外的代码没有被执行。这可以通过更改取消订阅呼叫进行检查,并放在
对话框isopen=false之后行。然后执行该行,但不执行函数的其余部分


这是虫子吗?我不应该退订活动吗

你打电话退订的目的是什么?在第一个stackblitz示例中,您没有取消订阅。为了避免内存泄漏,我建议限制可观察到的内容,而不是在您有的地方调用取消订阅。类似于
dialogRef.afterClosed().take(1).subscribe()
的东西,在解析一次后将自动取消订阅。谢谢@dmcgrandle,这解决了我的问题:
dialogRef.afterClosed().pipe(take(1)).subscribe()
但是,为什么测试失败?谢谢,这是rxjs的当前语法。:)我还没有亲自测试过您的特殊情况,但我猜这是因为您获得了对Subscribe的引用,然后一旦它解决了,您就立即取消订阅,从而使resolve函数的其余部分无效。使用take(1),您允许完成第一个解决方案,然后取消订阅。