【发布时间】:2020-09-26 03:46:16
【问题描述】:
我有一个Map,我想向几个消费者公开。该地图包含Files 的列表及其上传状态:
export interface FileProgress {
file: File;
sent: boolean;
}
所以这个Map 存储在BehaviorSubject 中,我将使用.asObservable() 方法公开:
private readonly fileProgressSubject: BehaviorSubject<Map<string, FileProgress>>;
我的问题是,对底层数据结构执行更新的最佳方式是什么?
如果BehaviorSubject 包含一个简单类型,比如mySubject: BehaviorSubject<boolean>,我会简单地调用mySubject.next(true),瞧,我已经更新了值。
但是在我的fileProgressSubject 中更新Map 更加麻烦。我需要访问地图,然后对其进行更改,所以这可行,但感觉不对:
const temp = fileProgressSubject.getValue();
temp.delete(someFileKey); // EXAMPLE OPERATION - DELETION
fileProgressSubject.next(temp);
这是对我的底层Map 进行更新的“正确”方式吗?我读过在Subject 上调用.getValue() 是强制使用反应式构造,这可能意味着您没有做对。
我的另一个想法是,因为这个 BehaviorSubject 将作为可观察对象公开,即使我可以看到 Typescript 编译器不允许这样做:
const fileObservable = fileProgressSubject.asObservable();
fileObservable.pipe(
map(fileProgressMap => fileProgressMap.delete(someFileName)), // DELETE A FILE FROM THE MAP
).subscribe(fileProgressSubject);
因此,基本上,将底层数据结构的当前值通过 observable 管道,对其进行更改,然后将新的Map 填充到主题中。但同样,这似乎是不可能的,不知道为什么。
那么,处理这种情况的最佳方法是什么?
【问题讨论】:
-
我的理解是,您希望在地图中的任何值发生更改时通知订阅者您的主题/可观察对象,并且通知的事件应该包含地图本身。我说的对吗?
标签: angular typescript rxjs