繁体   English   中英

RxJ如果完成则倒数第二次,否则在值之间插入延迟

[英]RxJs take last if completed, otherwise insert delay between values

我会给出完整的解释,但基本上我需要确保

  1. 发射值之间存在一些延迟
  2. 如果可观察值完成,则仅返回最新值。

给予比

我有两个观测值,每个观测值发出0或1个值,然后完成:

 //1. lazy observable that emit 0 or two value created at time of subscription and then completes
 const cache$ = this.getFromCacheLazy();

 //2.  ReplaySubject, that emits value in 1-1500ms and completes
 const request$ = this.executeRequest(); 

我将其组合为可观察的,首先发出缓存值(如果有),然后发出请求的值:

 const cacheAndRequest$ = concat(cache$, request$);

我稍后再订阅:

 setTimeout(() => {
     cacheAndRequest$.Subscribe(console.log);
 }, someDelay)

我如何

修改或cacheAndRequest$ ,以便:

  1. 如果$request在预订时已经完成,则必须忽略cache$值。

    • 提示:如果$ request已完成 ,则cacheAndRequest $在预订时也已完成。
  2. 如果订阅时$request未完成,请立即从$ cache发出值,并在500ms之后最早从$ request发出值。 换句话说,这两个值之间必须有一个延迟。

这是游乐场:

将此代码复制 此处

为此,我对您的cache$request$进行了一些修改,以标识可观察到的:

const cache$ = getFromCacheLazy().pipe(
  map(cache => {
    return {source: 'cache', value: cache};
  })
);

const request$ = executeRequest().pipe(
  map(request => {
    return {source: 'request', value: request};
  })
);

我离开了concat像你一样。

然后,我应用了withLatestFrom函数来获取最新的发射值。 如果最新发出的值来自request$我将其返回,否则我将可观察变量连接起来以返回cache$值,并等待至少500ms来发出request$

const $subscribeDelayed = timer(subscriptionDelay)
  .pipe(
    withLatestFrom(cacheAndRequest$), // Provide the latest value from cacheAndRequest$
    switchMap(res => {
      // if request$ is already completed at the time of subscription, cache$ value is ignored
      // else cache$ is emitted and request$ is emitted after at least 500ms
      return res[1].source === 'request'
        ? of(res[1].value)
        : concat(
          of(res[1].value),
          request$.pipe(
            delay(500),
            map(res => res.value)
          )
        );
    }),
    tap(res => console.log(res)),
  );

请参阅我在Stackblitz上的工作示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM