带有计时器的RxjsdistingtUntilChanged

时间:2018-06-19 12:42:15

标签: rxjs

是否可以将计时器添加到distinctUntilChanged?

在rxjs 6中

of(1, 2, 3, 3, 5, 6)
  .pipe(distinctUntilChanged)
  .subscribe(x => console.log(x)

我的问题是,有没有一种添加计时器的方法,以便重复值超出时间范围时将发出该重复值,但如果它们位于该时间范围内则将被忽略。

例如,如果将计时器设置为1000(1s),则在这种情况下interval(1000)并且在1s内发出重复值,它将被忽略,但是如果在间隔(1s)之后,则应允许通过。我希望在这里有意义

如果没有distinctUntilChanged的话,还有更好的方法,我会很高兴地欢迎您。

预先感谢

4 个答案:

答案 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')
    )