Angular 在RXJS中发出结果并链接新请求
我试图在RXJS中实现一个超级简单的缓存。我希望它的工作方式是:Angular 在RXJS中发出结果并链接新请求,angular,rxjs,Angular,Rxjs,我试图在RXJS中实现一个超级简单的缓存。我希望它的工作方式是: 首先从本地存储器中提取并将存储在那里的值发送给订阅服务器 调用web服务以获取本地存储中存储内容的最新版本 将更新后的值保存回本地存储 将最新值返回给订阅服务器 我尝试了下面的代码,但似乎直到服务调用响应后才返回。SwitchMap也没有做我想做的事 constpartnerkey=`partner-${partnerId}`; const localPartner=JSON.parse(localStorage.getItem(
constpartnerkey=`partner-${partnerId}`;
const localPartner=JSON.parse(localStorage.getItem(partnerKey));
this.partner$=of(localPartner)
.pipe(concatMap(=>partnersService.getById(partnerId))
.管道(接头)(合作伙伴=>{
setItem(partnerKey,JSON.stringify(partner));
返回伙伴;
}))));
this.partner$.subscribe(x=>console.log(x));
在上面的示例中,
console.log
应该被调用两次。我本以为concatMap会有多个发射,但也许我理解错了。谢谢你的帮助 @kyler johnson让我走上了正确的道路。我错误地认为每件事都应该是可管道的,但事实并非如此。我需要在管道外使用操作员。在本例中,我最终将两个获取的数据拆分为它们自己的可观察对象,然后将它们合并
constpartnerkey=`partner-${partnerId}`;
const fetchDataFromLocalStorage$=of(JSON.parse(localStorage.getItem('partner-'+partnerId));
const fetchDataFromServer$=partnersService.getById(partnerId)
.pipe(tap(partner=>localStorage.setItem('partner-'+partnerId,JSON.stringify(partner)));
this.partner$=concat(fetchDataFromLocalStorage$,fetchDataFromServer$);
您可以使用expand
,它直接发出值,并以前面的输出作为输入递归调用。在第一次执行后返回EMPTY
,以结束递归
const{of,EMPTY}=rxjs;
const{delay,expand}=rxjs.operators;
const fetchLocal=of('from local')。管道(延迟(500))
const fetchRemote=of('from remote')。管道(延迟(3000))
const source=fetchLocal.pipe(
展开((值,索引)=>索引<1?fetchRemote:空)
);
source.subscribe(console.log)代码>
我想问题出在“tap”操作符上。根据文档:“点击-对源可观测的每个发射执行副作用,但返回与源相同的可观测值。”看起来在您使用创建操作符的时,“map”比“tap”更适合您的情况,您可以创建一个默认值为localPartner
的可观察对象。pipe
操作符最初在创建可观察对象时执行,但不会再次执行,除非链接它的可观察对象发出新值。