[英]How do I force a refresh on an Observable service in Angular2?
在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請求以刷新其用戶視圖。 我怎么能這樣說呢?
我知道理想情況下我想跳過那個額外的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])
)
到目前為止我處理這個問題的方法是使用中介。 this.userService.getUsers()返回一個Rx.BehviorSubject ,它在http observable的返回時初始化。
接近這個:
getUsers() : BehaviorSubject<UserModel[]> {
return this.behaviorSubject;
}
updateUsers() {
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'))
.subscribe((value) => {
this.behaviorSubject.onNext(value)});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.