Angular和rxjs - 我需要connect或refCount吗?

ugl*_*ode 6 rxjs angular

基本上,我问过昨天重复使用来自可观察数据的数据,然后我也在其他地方问过并阅读了一些,然后我想,为什么不只是持有一个observable并用map操作符操纵数据.

所以我只做一个HTTP请求,将observable存储到某个变量并在那里操作它.代码有效,但我不确定我.publishReplay(1).refCount()是否使用正确,或者我应该使用connect?或者,我甚至需要这些吗?此外,是否有任何可能的内存泄漏可能来自此服务?

这是服务代码:

@Injectable()
export class UsersApiService {

  private readonly baseUrl: string = 'https://reqres.in/api/users';
  resource$: Observable<any>;

  constructor(private http: HttpClient) {
    this.resource$ = this.http.get<IUserDetails[]>(this.baseUrl).pipe(
      tap((data) => {
        console.log('"getUsers" successfully called!');
      }),
      map((data: any) => {
        return data.data;
      })
    ).publishReplay(1).refCount();
  }

  getUsers(): Observable<IUser[]> {
    return this.resource$.pipe(
      map((data: IUserDetails[]) => {
        return <IUser[]>data.map((u) => {
          return {
            id: u.id,
            name: `${u.first_name} ${u.last_name}`
          };
        });
      })
    );
  }

  getUserById(id: number): Observable<IUserDetails> {
    return this.resource$.pipe(
      map((data) => {
        return <IUserDetails>data.find(x => x.id === id);
      })
    );
  }

}
Run Code Online (Sandbox Code Playgroud)

以及工作示例:http://plnkr.co/edit/3S8iKbvrrGOj9netd8sM?p=preview

Ing*_*ürk 7

我不确定我是否正确使用.publishReplay(1).refCount()

是的,你是.您也可以使用shareReplay(1).

或者我应该使用连接?

refCount() 当第一个订户出现时已经为您连接(并且当所有观察者都取消订阅时断开连接).

我甚至需要这些吗?

如果你想把它作为一个可观察的,是的.否则,您将一遍又一遍地查询后端.但是,你当然也可以记住最后一次发射:

private resource: Observable<IUserDetails[]>;

constructor(http: HttpClient) {
    this.http.get(/* … */).subscribe(data => this.resource = data);
}

getUserById(id: number): IUserDetails {
    return this.resource.find(x => x.id === id);
}
Run Code Online (Sandbox Code Playgroud)

此外,是否有任何可能的内存泄漏可能来自此服务?

不,因为HttpClient完成了它的返回可观察性,这意味着您的多播可观察源的源是断开的.