在触发第一个事件后,是否有方法执行第二个事件?
在下面的例子中,我想在调用touchmove事件后使用滚动事件。
fromEvent(window, 'touchmove').pipe(
tap(() => this.scroll$.next(false),
debounceTime(100)
).subscribe(() => {
this.scroll$.next(true);
})
如果您的scroll$
Observable
可以依赖于其他可观察性,并且不必是Subject
,则可以让它直接依赖于fromEvent
Observable
。
private sroll$ = fromEvent$(window, 'touchmove').pipe(
switchMapTo(
merge(
of(false),
timer(100).pipe(mapTo(true))
)
)
)
scroll$
Observable由fromEvent$(window, 'touchmove')
Observable触发。然后我们把switchMapTo
转换成一个组合算子merge
:
- 通过这种方式,我们可以通过创建仅具有
of(false)
值的Observable来立即返回false
值 - 此外,我们可以启动
timer
,在100毫秒后激发true
如果你真的不能使用touchstart
和touchend
,唯一的方法就是使用debounceTime
管道
const mousemove$ = fromEvent(document, 'mousemove');
mousemove$
.pipe(
first(),
switchMap(() => mousemove$),
tap(() => this.scroll$.next(false)),
debounceTime(1000)
)
.subscribe(() => {
this.scroll$.next(true);
});
Stacklitz演示