使用异步管道在模板中的多个位置使用相同的observable的性能

Bog*_*gac 32 rxjs angular

在我的组件模板中,我async在2个位置调用相同Observable的管道.

我应该订阅它并在我的模板中使用返回的数组,或者async在多个模板位置使用相同的Observable管道对性能没有负面影响?

ols*_*lsn 110

每次使用observable$ | async都会创建一个新的订阅(以及一个单独的流)到给定的observable$- 如果这个observable包含重度计算或休息调用的部分,那些计算和休息调用将分别为每个执行async- 所以是 - 这可以有性能影响.

然而,这是很容易固定延长你observable$.share(),让所有用户之间共享的数据流,并为所有用户执行所有这些事情只有一次.不要忘记添加share-operatorimport "rxjs/add/operator/share";

默认情况下,异步管道不共享订阅的原因仅仅是灵活性和易用性:.share()编写简单文件比创建全新流程要快得多,如果默认情况下共享它们将是必需的.

这是一个简单的例子

@Component({
    selector: "some-comp",
    template: `
        Sub1: {{squareData$ | async}}<br>
        Sub2: {{squareData$ | async}}<br>
        Sub3: {{squareData$ | async}}
    `
})
export class SomeComponent {
    squareData$: Observable<string> = Observable.range(0, 10)
        .map(x => x * x)
        .do(x => console.log(`CalculationResult: ${x}`)
        .toArray()
        .map(squares => squares.join(", "))
        .share();  // remove this line and the console will log every result 3 times instead of 1
}
Run Code Online (Sandbox Code Playgroud)

  • 我希望我能给你一千个赞成票!谢谢 (3认同)

Roy*_*Art 13

避免多个订阅的另一种方法是使用包装*ngIf="obs$ | async as someName".使用olsn的例子

    @Component({
        selector: "some-comp",
        template: `
          <ng-container *ngIf="squareData$ | async as squareData">
            Sub1: {{squareData}}<br>
            Sub2: {{squareData}}<br>
            Sub3: {{squareData}}
          </ng-container>`
    })
    export class SomeComponent {
        squareData$: Observable<string> = Observable.range(0, 10)
            .map(x => x * x)
            .do(x => console.log(`CalculationResult: ${x}`)
            .toArray()
            .map(squares => squares.join(", "));

    }
Run Code Online (Sandbox Code Playgroud)

它也很酷,因为它也清除了模板.

  • 在很多情况下,这是一个很酷的解决方案。但是如果 observable 返回一个虚假的值,比如“false”,“0”,...! (3认同)