问题描述
假设我有一个获取用户的http请求:
users$: Observable<User[]>;
ngOnInit() {
users$ = this.users_service.get_all_users();
}
我在模板中使用异步管道订阅了此可观察的内容:
<div *ngFor="let user of users$ | async">
我想更改具有另一个http请求的单个用户的电子邮件,但保留单个订阅。问题是在我创建的users$
可观察点尚未定义更改电子邮件的http请求。
我所做的是:
users$: Observable<User[]>;
update_user_event$ = new BehaviorSubject(null);
users_with_updates$: Observable<User[]>;
ngOnInit() {
users$ = this.users_service.get_all_users();
users_with_updates$ = Observable.combineLatest(users$,update_user_event$)
.switchMap(([users,update_user_event]) => {
return Observable.of(users)
})
}
update_user(user) {
this.user_service.update_user(user)
.toPromise() // <== I don't want to subscribe to this request. Is there a way to combine it with `users$` without subscribing?
.then(updated_user => {
for(let key of user) {
user[key] = updated_user[key]
}
update_user_event$.next(null);
})
}
如您所见,我使用update_user
订阅了toPromise()
。由于无法定义该请求,因此无法提前合并。
我一直在互联网上搜索,但找不到商定的最佳实践。
您认为应该怎么做?
谢谢
解决方法
我建议将用户存储在一个主题中。初始调用以及所有更新都将在BehaviorSubject上调用next
。
private users: BehaviorSubject<User[]> = new BehaviorSubject<User[]>([]);
users$: Observable<User[]> = this.users.asObservable();
ngOnInit() {
this.users_service.get_all_users().subscribe(this.users);
}
update_user(user) {
this.user_service.update_user(user)
.toPromise()
.then(user => {
const currentUsers = this.users.value;
// TODO: change user in currentUsers
this.users.next(currentUsers);
})
}