簡體   English   中英

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

[英]Angular and rxjs - do I need connect or refCount?

基本上,我昨天詢問了重復使用來自可觀察數據的數據,然后我也在其他地方詢問並閱讀更多內容然后我想,為什么不只是持有一個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);
      })
    );
  }

}

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

我不確定我是否正確使用.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);
}

此外,這項服務可能會出現任何可能的內存泄漏嗎?

不,因為HttpClient完成了它的返回observable,這意味着你的多播observable的源被斷開了。

如果您的目標是重用http調用,為什么不使用share運算符。 它基本上為您在幕后處理發布和refCount。

文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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