如何使用rxjs observables为缓存的Angular2 http响应添加到期时间

如何使用rxjs observables为缓存的Angular2 http响应添加到期时间,angular,caching,rxjs,rxjs5,angular2-observables,Angular,Caching,Rxjs,Rxjs5,Angular2 Observables,我使用rxjspublishReplay(1)和refCount缓存http响应。为缓存设置过期时间的最佳方法是什么。我正在使用http调用获取令牌,该调用每1小时过期一次 @Injectable() export class SearchService{ public url: string; private token:Observable<any> = null; constructor(private _http:Http){ } getSecurityToken(ur

我使用rxjs
publishReplay(1)
refCount
缓存http响应。为缓存设置过期时间的最佳方法是什么。我正在使用http调用获取令牌,该调用每1小时过期一次

@Injectable()
export class SearchService{
public url: string;
private token:Observable<any> = null;

constructor(private _http:Http){

}

getSecurityToken(url:string): any {

    headers.append("securitycode","*******");

    if(!this.token){
        this.token = this._http.post(url,{headers:headers})
            .map(this.extractData)
            .publishReplay(1)
            .refCount()
            .catch(this.handleError);
    }
    return this.token;
}     


private extractData(res: Response) {
    console.log(res.status);
    if(res.status == 204) { 
        return [];
    }
    else{
        let body = res.json();
        return body;
    }
}

private handleError (error: any) {
    let errMsg = (error.message) ? error.message :
      error.status ? `${error.status} - ${error.statusText}` : 'Server error';
   console.error(errMsg); // log to console instead
   return Observable.throw(errMsg);
}
@Injectable()
导出类搜索服务{
公共url:string;
私有令牌:可观察=空;
构造函数(私有的http:http){
}
getSecurityToken(url:string):任意{
headers.append(“securitycode”,“*******”);
如果(!this.token){
this.token=this.\u http.post(url,{headers:headers})
.map(此.extractData)
.publishReplay(1)
.refCount()
.接住(这个.把手错误);
}
返回此.token;
}     
私有数据(res:Response){
控制台日志(res.status);
如果(res.status==204){
返回[];
}
否则{
让body=res.json();
返回体;
}
}
私有句柄错误(错误:任意){
让errMsg=(error.message)?error.message:
error.status?`${error.status}-${error.statusText}`:'服务器错误';
console.error(errMsg);//改为登录到控制台
返回可观察抛出(errMsg);
}

publishReplay内部使用
ReplaySubject
作为第二个参数,时间窗口定义每个缓存项的有效时间

因此,在您的情况下,可以是例如:

...
.publishReplay(1, 60 * 1000)

请参阅:

以防万一,其他人会遇到这个问题:可以在此处找到更好的解决方案:

我也有同样的问题,问了以下问题:


投票关闭此问题,但添加了新链接,以防其他人找到此解决方案并花4小时调试它,就像我一样

谢谢@martin。我已尝试使用
publishReplay(1,60*1000)
。我在加载页面时进行此rest调用。当我第一次加载它时,我会得到响应,但当我返回到该页面时,它不会提供任何数据。该页面为空。我是否必须在
refCount()之后添加
.map(this.extractData)
我不知道,因为我不知道你的应用程序是做什么的。你能做一个plnkr或JSFIDLE演示吗?如果所有订阅者都取消订阅,它将不起作用。缓冲区将被清除。@moonstom如何进行自动订阅(嗯,数据检索)在缓存过期后?在我的情况下似乎不需要它-我在页面上使用异步管道-然而,当使用第二个参数时,我遇到了“empy cells”问题(显然,在缓存过期后)。我在谷歌找到了这个答案,但也有同样的问题。在这里可以找到更好的答案;注意(1)最后的请求真的很重要!