在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
而不遇到这种情况,那么应该使用什么样的正确模式?
尝试将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>