在 ngOnInit
中,我的组件像这样获取用户列表:
this.userService.getUsers().subscribe(users => {
this.users = users;
});
userService.getUsers() 的实现如下所示:
getUsers() : Observable<UserModel[]> {
return this.http.get('http://localhost:3000/api/user')
.map((res: Response) => <UserModel[]>res.json().result)
.catch((error: any) => Observable.throw(error.json().error || 'Internal error occurred'));
}
现在,在另一个组件中,我有一个可以创建新用户的表单。问题是,当我使用第二个组件创建用户时,第一个组件不知道它应该向后端发出新的 GET 请求以刷新其用户 View 。我该如何告诉它这样做?
我知道理想情况下我想跳过那个额外的 HTTP GET 请求,并简单地附加客户端在创建 POST 时已经拥有的数据以插入数据,但我想知道如何完成在出于任何原因无法做到这一点的情况下。
最佳答案
为了让 Observable 能够在初始 Http Observable 完成后提供值,它可以由 RxJS 主题提供。由于缓存行为是可取的,ReplaySubject
适合这种情况。
应该是这样的
class UserService {
private usersSubject: Subject;
private usersRequest: Observable;
private usersSubscription: Subscription;
constructor(private http: Http) {
this.usersSubject = new ReplaySubject(1);
}
getUsers(refresh: boolean = false) {
if (refresh || !this.usersRequest) {
this.usersRequest = this.http.get(...).map(res => res.json().result);
this.usersRequest.subscribe(
result => this.usersSubject.next(result),
err => this.usersSubject.error(err)
);
}
return this.usersSubject.asObservable();
}
onDestroy() {
this.usersSubscription.unsubscribe();
}
}
由于主题已经存在,可以在不从服务器更新列表的情况下推送新用户:
this.getUsers().take(1).subscribe(users =>
this.usersSubject.next([...users, newUser])
)
关于angular - 如何强制刷新 Angular2 中的 Observable 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40249629/