2017-03-19 8 views
0

특정 Angular2 HTTP 호출 (서버에서 내 사용자 프로필 가져 오기) 결과를 캐시하고 프로필을 업데이트 할 때까지 캐시를 유효하게 유지하려고합니다. .특정 조건이 변경 될 때까지 HTTP 호출을 한 번 실행하고 값을 캐시합니다.

이것은 내가 가지고있는 코드입니다.이 코드는 값을 캐시하지만 프로파일이 변경 되더라도 절대 업데이트하지 않습니다.

readonly user$: Observable<User> = this.http 
    .get(`${this.baseUrl}/me`) 
    .map(r => r.json()) 
    .publishLast() 
    .refCount(); 

updateProfile(user: User): Observable<any> { 
    return this.http.put(`${this.baseUrl}/me`, user); 
    // cause the existing user$-subscriptions to update with the user value 
} 

는 바람직 나는 프로파일이 updateProfile에 전달 된 user 값으로 기존 구독을 업데이트 할. 이것은 Rx-y 방법으로 멋지게 수행 할 수 있습니까? 아니면 Subject을 사용하여 수동으로 업데이트해야합니까?

답변

0

나는 분명히 대답에서 불과 몇 분 밖에 걸리지 않았다. 해결 방법은 사용자 업데이트를 위해 Subject을 만드는 것입니다.

HTTP 관찰 가능 (한 번만 실행하도록 함)으로 해당 주제를 병합하십시오. 그런 다음 업데이트 할 때 새로운 user 값을 제목에 넣습니다. 그러면 초기 HTTP 요청과 캐시 된 응답을 얻을 수 있습니다.

private readonly userSubject = new Subject<User>(); 
readonly user$: Observable<User> = this.userSubject 
    .merge(this.http 
     .get(`${this.baseUrl}/me`) 
     .map(r => r.json()) 
     .publishLast() 
     .refCount() 
    ); 

updateProfile(user: User): Observable<any> { 
    return this.http.put(`${this.baseUrl}/me`, user) 
     .map(r => r.json()) 
     .do(() => this.userSubject.next(user)); 
} 

더 세련된 접근법을 높이 평가할 수 있습니다. :)