我想知道是否有人可以帮助我提出解决方案的理论。我从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();
})
答案 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 ...