带有asObservable的Subject.error导致Angular 6异步管道快速消耗所有系统内存

时间:2018-08-03 17:43:15

标签: angular rxjs subject

在Angular 6中,我有一个非常简单的组件,如下所示:

import { Component, OnInit } from '@angular/core';
import { BehaviorSubject ,  Subject ,  Observable } from 'rxjs';

@Component({
    selector: 'test',
    templateUrl: 'test.component.html',
    styleUrls:[]    
})
export class TestComponent implements OnInit{

    someSubject: BehaviorSubject<string> = new BehaviorSubject("Hey");    

    ngOnInit(){
        this.someSubject.error("Some error.");
    }

    get observable():Observable<string>{
        return this.someSubject.asObservable();
    }

}

...以及此模板:

<div>
    Will it resolve?

    <div *ngIf="observable | async as value">
        Value: {{value}}
    </div>

</div>

运行此命令时,我希望会遇到错误,它将关闭流并且根本不呈现(就像我叫过.complete一样),但是它将迅速将错误消息输出到控制台并将很快消耗我开发箱中的所有24GB内存。

为什么会这样?真的可以是,如果您允许错误输入async管道中,那么您的惩罚就是系统内存的全部耗尽了吗?

编辑:

我现在看到是导致该问题的asObservable调用,因为它每次都在获取一个新实例(尽管我仍然认为如果现有实例出错,它不应再返回更多实例) 。如果我只想向下游公开Observable而不碰到这种情况,该使用哪种正确的模式?

1 个答案:

答案 0 :(得分:1)

尝试将get更改为property

import { Component, OnInit } from '@angular/core';
import { BehaviorSubject ,  Subject ,  Observable } from 'rxjs';

@Component({
    selector: 'test',
    templateUrl: 'test.component.html',
    styleUrls:[]    
})
export class TestComponent implements OnInit{

    someSubject: BehaviorSubject<string> = new BehaviorSubject("Hey");    
    data$;

   ngOnInit(){
       this.data$ = this.someSubject.asObservable();
    }


}

模板

<div>
    Will it resolve?

    <div *ngIf="data$| async as value">
        Value: {{value}}
    </div>

</div>