Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 在RXJS中发出结果并链接新请求_Angular_Rxjs - Fatal编程技术网

Angular 在RXJS中发出结果并链接新请求

Angular 在RXJS中发出结果并链接新请求,angular,rxjs,Angular,Rxjs,我试图在RXJS中实现一个超级简单的缓存。我希望它的工作方式是: 首先从本地存储器中提取并将存储在那里的值发送给订阅服务器 调用web服务以获取本地存储中存储内容的最新版本 将更新后的值保存回本地存储 将最新值返回给订阅服务器 我尝试了下面的代码,但似乎直到服务调用响应后才返回。SwitchMap也没有做我想做的事 constpartnerkey=`partner-${partnerId}`; const localPartner=JSON.parse(localStorage.getItem(

我试图在RXJS中实现一个超级简单的缓存。我希望它的工作方式是:

  • 首先从本地存储器中提取并将存储在那里的值发送给订阅服务器
  • 调用web服务以获取本地存储中存储内容的最新版本
  • 将更新后的值保存回本地存储
  • 将最新值返回给订阅服务器
  • 我尝试了下面的代码,但似乎直到服务调用响应后才返回。SwitchMap也没有做我想做的事

    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
    操作符最初在创建可观察对象时执行,但不会再次执行,除非链接它的可观察对象发出新值。