【发布时间】:2020-11-11 09:25:32
【问题描述】:
假设我有一个获取用户的 http 请求:
users$: Observable<User[]>;
ngOnInit() {
users$ = this.users_service.get_all_users();
}
我在模板中使用异步管道订阅了这个 observable:
<div *ngFor="let user of users$ | async">
我想通过另一个 http 请求更改单个用户的电子邮件,但保留单个订阅。问题是在我创建users$ observable 时尚未定义更改电子邮件的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);
})
}
如您所见,我使用toPromise() 订阅了update_user。我不能提前合并这个请求,因为它在被请求之前没有定义。
我一直在互联网上搜索,但找不到公认的最佳做法。
你觉得应该怎么做?
谢谢
【问题讨论】:
-
换个说法,您希望对用户的更新触发相同的
users$observable,以便您的组件在您更新用户时得到通知? -
我不确定。我想以响应式方法使用 HTTP 请求更改单个用户。我认为它可以通过异步管道仅使用一个订阅来完成,但我不确定这是否可能,所以我想听听关于应该如何完成的专业意见。
标签: angular rxjs async-pipe