如何使用rxjs observables为缓存的Angular2 http响应添加到期时间
我使用rxjs如何使用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
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)最后的请求真的很重要!