Angular 当我在要迭代的元素中调用异步管道时,它是创建一个共享订阅还是多个共享订阅?

Angular 当我在要迭代的元素中调用异步管道时,它是创建一个共享订阅还是多个共享订阅?,angular,rxjs,Angular,Rxjs,有一个关于Angular如何处理异步管道的快速问题:给定以下代码块,如果我调用元素中的函数,该函数将被渲染N次,并使用异步管道将可观测值作为参数传递给它,传递给这些函数执行的订阅是共享的还是独立的订阅 <ng-container *ngFor="..."> <div>{{ getSomeValue(myObservable$ | async) }}</div> </ng-container> {{getSomeValue

有一个关于Angular如何处理异步管道的快速问题:给定以下代码块,如果我调用元素中的函数,该函数将被渲染N次,并使用异步管道将可观测值作为参数传递给它,传递给这些函数执行的订阅是共享的还是独立的订阅

<ng-container *ngFor="...">
  <div>{{ getSomeValue(myObservable$ | async) }}</div>
</ng-container>

{{getSomeValue(myObservable$| async)}

谢谢

每个异步管道将产生一个新的订阅。 因此,为了避免不必要的订阅,您可以使用
*ngIf
方法

<ng-container *ngIf="(myObservable$ | async) as myValue">
    <ng-container *ngFor="...">
       <div>{{ getSomeValue(myValue) }}</div>
    </ng-container>
</ng-container>

{{getSomeValue(myValue)}

myObservable$|async
将计算并绑定到
myValue
的值,然后无需在模板子树中进一步订阅即可使用。

超出正常答案,不要调用具有异步值的方法

每次发生变化检测时,它都会一次又一次地订阅和取消订阅所有可观察对象。 您可以使用noam的答案,也可以尝试映射列表(如果需要)

public list$ = this.myObservable.pipe(map(obsValue => this.array.map(row => this.getSomeValue(obsValue)));

这在性能方面会更好,因为angular每秒调用getSomeValue 10次。

虽然这是一个不错的参数,但在性能方面,据我所知,angular可以适当地处理订阅。i、 订阅在不再使用时取消订阅。因此,您的活动订阅数量不会增加。我认为您是对的,我编辑了该部分。感谢注意我认为不建议在HTML模板内进行函数调用,您可以在变量中分配执行结果并在模板内进行绑定。不建议这样做。在我看来,函数调用与异步管道和订阅的问题无关,因此我没有解决这个问题。有一些技术可以避免这种情况,这取决于用例。