[英]RxJs take last if completed, otherwise insert delay between values
我会给出完整的解释,但基本上我需要确保
我有两个观测值,每个观测值发出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$
,以便:
如果$request
在预订时已经完成,则必须忽略cache$
值。
如果订阅时$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.