Subject.error with asObservable 导致 Angular 6 异步管道快速消耗所有系统内存
Subject.error with asObservable causes Angular 6 async pipe to rapidly consume all system memory
在 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>
在 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>