angular - 如何强制刷新 Angular2 中的 Observable 服务?

标签 angular rxjs

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/

相关文章:

Angular 2初始加载进度

angular - 用于 Angular 行重新排序的 Kendo Grid - Angular 4/5 - HTML5 拖放 API

javascript - 具有异步订阅者功能的 RxJS Observable

typescript - 如何将变量的类型声明为可观察函数返回的类型?

javascript - 了解群组加入

Angular Material 2 MatMenu - 动态创建

javascript - ngmodelchange 在 Angular 6 Material 中调用了两次

typescript - 如何引用第三方 npm 模块?

Angular 4 - 找不到名称 'HttpClient'

javascript - forEach 运算符在没有订阅的情况下被评估