作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从查询表中获取数据!
如果已经获取,则从localStorage获取数据或按服务获取,然后存储到localStorage中。
如果先前的请求已在处理中,则其他请求应等待完成,以便它们可以从localStorage获取数据
伪代码:
isInProgress = false;
getLookup(lookupName: string) {
if(this.isInProgress)
// Code to wait, no delay or timer, please
if(localStorage(lookupName)){
return of(localStorage.get(lookupName));
} else {
this.isInProgress = true;
let url = `..../getLooup?name= {lookupName}`;
this.httpClient.get(url).subscribe(data => {
// Some other code to process the logic
let processedData = someProcess(data);
localStorage.set(lookupName, processedData);
this.isInProgress = false;
return of(processedData)
}, error => {
this.isInProgress = false;
// Log error and other code
})
}
}
xvyService.getLookup('A').subscribe(.....);
xvyService.getLookup('A').subscribe(.....);
xvyService.getLookup('A').subscribe(.....);
xvyService.getLookup('A').subscribe(.....);
最佳答案
shareReplay
可用于实现简单的缓存。它在第一个订阅上订阅一次源Observable,然后将值重播到所有以后的订阅。如果无法立即重播任何值,以后的订阅将自动“等待”。
一般逻辑
if value in local storage
return from local storage
else if cache not initialized
cache = apiCall.pipe(
// do things on first call only
shareReplay(1) // replay last value
// do things on all calls
)
endif
return cache
let cache$: Observable<any>;
getLookup(lookupName: string): Observable<any> {
const fromStorage = localStorage.getItem("lookupName");
if (fromStorage) {
console.log("from local storage");
return of(JSON.parse(fromStorage));
} else if (!this.cache$) {
console.log("initializing cache");
this.cache$ = this.requestData().pipe(
map(data => {
console.log('doing stuff');
const processedData = { ...data, a: 1 }
localStorage.setItem("lookupName", JSON.stringify(processedData));
return processedData
}),
shareReplay(1),
// Move catchError above shareReplay if you want to replay the safe error value instead
catchError(error => {
// Log error and other code - return default value on error
return of(null);
})
// Populate local storage on every call and not just the first one
//tap(data => localStorage.setItem("lookupName", JSON.stringify(data)))
);
}
return this.cache$;
}
关于angular - RXJS Angular一次调用一个方法并存储结果,在所有后续请求中返回存储的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60078460/
我的代码遇到了很大的困难。我正在开发一个显示歌词和和弦的应用程序。我使用两个重叠的textview分隔了和弦和歌词。 我在这个项目中遇到的问题是音高改变功能。我尽我所能向我解释得更好: 和弦总数为12
我有一个游戏并使用 Tune 作为分析库。使用最新的 Unity (5.3.4f1) 并通过 Unity 获取 apk(无 eclipse/android studio)。 我的游戏在 Play 商店
我是一名优秀的程序员,十分优秀!