RxJS Observables和车轮事件

时间:2018-07-18 17:34:14

标签: rxjs reactive-programming

我想知道是否有人可以帮助我提出解决方案的理论。我从wheel事件创建一个Observable,阻止默认操作,将其限制200ms,映射deltaY(可用于确定方向),然后共享它。

我的问题是,它发出的值超出了我所需要的状态,即使在发生所需的操作后,订户仍会继续触发。我是RxJS的新手,所以请耐心等待,但是...我是否可以在说经过的X时间内量取一系列值中发出的“第一个”值,而又没有可观察到的完整值?

下面是代码。

import { fromEvent } from 'rxjs';

const wheel$ = fromEvent(document, 'wheel')
    .pipe(
        tap((event) => event.preventDefault()),
        // throttleTime(200), /* I have tried throttling and debouncing but that doesn't work - values will continue to be emitted */
        map((event) => event.deltaY),
        share()
    )

 // handles scrolling down //
 wheel$.pipe(filter((val) => val > 0))
     .subscribe((event) => {
         if (this.props.isScrolling) return
         this.scrollDown();
     })

2 个答案:

答案 0 :(得分:1)

一种解决方案是“ bufferCount()”

of(1,2,3,4,5,6,7,8,9).pipe(
  bufferCount(3)
).subscribe(data => console.log(data) )

将创建3个信号的包。因此事件将会是

[1,2,3]
[4,5,6]
[7,8,9]

或“ throttleTime(xy)”,它将使第一个信号通过,每隔一个信号将忽略“ xy”毫秒,然后给下一个信号一个机会。

interval(500).pipe(
  throttleTime(2000)
).subscribe(data => console.log(data) )

将导致类似

1 // ignore everything the next 2 seconds
5 // ignore everything the next 2 seconds
9 // ignore everything the next 2 seconds
...

热烈的问候

答案 1 :(得分:0)

在寻找解决方案时发现了这个问题。 我去了一个switchMap

ScoreQuiz <- function(x) {
  x$Q1_Score <-  as.integer(x$Q1 == 'C')
  x$Q2_Score <-  as.integer(x$Q2 == 'D')
  return(x)
} 

str(ScoreQuiz(df))

#'data.frame':  12 obs. of  5 variables:
# $ SubID   : int  1 2 3 4 5 6 7 8 9 10 ...
# $ Q1      : chr  "A" "C" "D" "A" ...
# $ Q2      : chr  "D" "A" "B" "D" ...
# $ Q1_Score: int  0 1 0 0 1 0 0 1 0 0 ...
# $ Q2_Score: int  0 0 1 0 0 1 0 0 1 0 ...