簡體   English   中英

如何在Angular2中強制刷新Observable服務?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM