是否可以将计时器添加到distinctUntilChanged?
在rxjs 6中
of(1, 2, 3, 3, 5, 6)
.pipe(distinctUntilChanged)
.subscribe(x => console.log(x)
我的问题是,有没有一种添加计时器的方法,以便重复值超出时间范围时将发出该重复值,但如果它们位于该时间范围内则将被忽略。
例如,如果将计时器设置为1000(1s),则在这种情况下interval(1000)
并且在1s内发出重复值,它将被忽略,但是如果在间隔(1s)之后,则应允许通过。我希望在这里有意义
如果没有distinctUntilChanged
的话,还有更好的方法,我会很高兴地欢迎您。
预先感谢
答案 0 :(得分:3)
这是windowTime
有用的极少数情况之一。 windowTime
在一段时间过去之后创建了一个新的Subject(所谓的高阶Observable)。然后,您可以使用concatMap
将其与distinctUntilChanged
链接。这一切都意味着您将每1秒创建一个新的distinctUntilChanged
:
const subject = new Subject();
subject
.pipe(
windowTime(1000),
concatMap(obs => obs.pipe(distinctUntilChanged())),
)
.subscribe(console.log);
subject.next(1);
subject.next(2);
setTimeout(() => subject.next(2), 1200);
观看现场演示:https://stackblitz.com/edit/rxjs6-demo-pcmrzz?file=index.ts
答案 1 :(得分:1)
skipUntil
应该可以满足您的需求。
这可以是一个例子
const obs = interval(100).pipe(
tap(d => console.log('data emitted', d)),
take(10),
);
obs
.pipe(
skipUntil(interval(500).pipe(take(1)))
)
.subscribe(
data => console.log('data read in the subscription', data)
)
答案 2 :(得分:1)
很高兴考虑这个问题,我最终使用了以下两个可观察值中的merge:
简单的distincUntilChanged用于新值:
const untilChanged$ = sharedRequest$
.pipe(distinctUntilChanged());
如果没有收到新值,则将每隔n毫秒重新发送最后一个值的填充器:
const gapFiller$ = untilChanged$
.pipe(switchMap(a => interval(3000)
.pipe(mapTo('Resend - ' + a))));
每次interval
发送新值时,此Observable都会创建一个新的untilChanged$
。
Here is the stackblitz demonstration,请打开浏览器控制台而不是stackblitz控制台,以确保每次触发之间的时间间隔。我在gapFiller$
可观察值发送的值之前添加了“重新发送”字符串。
答案 3 :(得分:0)
只需将date属性附加到先前的地图输出中,然后在distingtUntilChanged中进行比较,然后在:)之后拔出date属性即可。
fromEvent(document, 'keydown')
.pipe(
map(e => ({key: e.key, time: Date.now()})),
distinctUntilChanged((a, b) => (a.key == b.key) && (a.time > b.time - 500)),
pluck('key')
)