【问题标题】:Angular: are nested async pipe usage safe?Angular:嵌套的异步管道使用安全吗?
【发布时间】:2020-04-29 11:17:21
【问题描述】:

我找不到任何与此相关的文档,所以在这里。我在模板中使用了异步管道:

<component [aliases]="(users$ | async).profile.aliases$ | async"/>

users$ 发出时,aliases$ 订阅是否正确取消订阅?如果包装元素上有*ngIf 怎么办?

【问题讨论】:

    标签: angular rxjs rxjs6 rxjs-observables


    【解决方案1】:

    为避免使用多个 async 管道,请在类中尝试此操作

    aliases$ = this.users$.pipe(
      switchMap(users => users.profile.aliases$),
    )
    
    <component [aliases]="aliases$ | async"/>
    

    关于您的安全问题。订阅内部 observable 将是有效的。检查此堆栈闪电战https://stackblitz.com/edit/angular-f88kfn

    如果我们深入了解AsyncPipe 的来源,我们会发现管道在ngOnDestroy 挂钩中取消订阅。但如果“外部”可观察对象在“流”中有新值,则不会调用它。所以只需使用switchMap 和一个async 管道。

    希望对你有帮助。

    【讨论】:

    • 很好,我确实打算使用 switchMap 解决方案以防万一,但很高兴知道基本行为。
    • 分叉你的 stackblitz 以检查在 var1 && (obs1 | async) 的情况下,然后 obs1 在 var1 === false 上被取消订阅,但事实并非如此。 stackblitz.com/edit/angular-zkh9w6
    猜你喜欢
    • 2021-01-24
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2020-11-13
    • 2012-07-22
    相关资源
    最近更新 更多