如何在RxJS中超时事件?
我试图检测如何在RxJS中超时事件?,rxjs,Rxjs,我试图检测mousedown事件是否在mouseup之前保持一段时间 我在使用fromEvent()创建的可观察对象上使用timeout(),但超时会返回两个可观察对象 下面,如果在1秒内触发了mousedown,订阅流将返回事件,但它也会返回1 var mousedown=Rx.Observable.fromEvent(目标“mousedown”); var stream=mousedown.timeout(1000,Rx.Observable.return(1)); var sub=stre
mousedown
事件是否在mouseup
之前保持一段时间
我在使用fromEvent()
创建的可观察对象上使用timeout(),但超时会返回两个可观察对象
下面,如果在1秒内触发了mousedown
,订阅流将返回事件,但它也会返回1
var mousedown=Rx.Observable.fromEvent(目标“mousedown”);
var stream=mousedown.timeout(1000,Rx.Observable.return(1));
var sub=stream.subscribe(
函数(x){
console.log('Next:'+x);
},
功能(err){
log('Err:'+Err);
},
函数(){
console.log('Complete');
}
);
但是,这是可以预期的:
var-source=Rx.Observable.return(42)
.延迟(200)
.超时(1000,接收可观察返回(1));
我希望此代码能够正常工作:
var mousedown=Rx.Observable.fromEvent(目标“mousedown”);
var mouseup=Rx.Observable.fromEvent(目标“mouseup”);
var clickhold=mousedown
.flatMap(函数(){
返回鼠标悬停超时(1000,Rx.Observable.return('hold'));
})
.过滤器(功能(x){
返回x==‘保持’;
});
单击保持。订阅(
函数(x){
console.log('Next:'+x);
},
功能(err){
log('Err:'+Err);
},
函数(){
console.log('Complete');
}
);
我没有使用,而是使用和:
var目标,
穆斯敦,
鼠标;
target=document.querySelector('input');
mousedown=Rx.Observable.fromEvent(目标“mousedown”);
mouseup=Rx.Observable.fromEvent(目标“mouseup”);
var clickhold=mousedown
.flatMap(函数(){
//鼠标按下事件后立即触发。
返回Rx。可观察
.return('hold'))
.延迟(1000)
//如果time.delay()完成,则丢弃返回值
//mouseup事件已完成。
.takeUntil(mouseup);
});
单击保持。订阅(
函数(x){
console.log('Next:'+x);
},
功能(err){
log('Err:'+Err);
},
函数(){
console.log('Complete');
}
);代码>
您自己想出了一个很好的解决方案。以下是我要改变的:
移动内部可观察(计时器(…)。取出(…)。从中选择(…)
),这样就不会为每个鼠标下移重新分配
其余的你都做对了。对于我的使用,我通常保留原始的mousedown
事件,并使用该事件而不是'hold'
。这需要returnValue
和delay
而不是timer
和select
var目标,
穆斯敦,
鼠标;
target=document.querySelector('input');
mousedown=Rx.Observable.fromEvent(目标“mousedown”);
mouseup=Rx.Observable.fromEvent(目标“mouseup”);
var clickhold=mousedown
.flatMap(函数(e){
返回Rx。可观察
.返回(e)
.延迟(1000)
.takeUntil(mouseup);
});
单击保持。订阅(函数(x){
log('onNext:',x);
});代码>
谢谢!我也在考虑使用switchLatest,您的示例清楚地说明了我如何使用它。作为后续,您将如何在“点击保持”后检查鼠标是否弹出?我订阅的是Observable.when(clickhold.and(mouseup).then(function(){return'release';}),mouseup.then(function(){return'mouseup';}),以反转状态。我对你的要求有点困惑。如“check for”在讨论基于同步拉取的系统时效果非常好,但在讨论事件时我很难理解。你能重新措辞吗?基本上,我想检查“clickhold”序列后面是否有鼠标。例如,如果我单击一个框并更改其颜色,那么在鼠标上我想重新更改颜色。我这里有一个使用when()的解决方案:但我想知道是否有一种更简洁的方法来实现它。您可能对Paul Taylor针对RxJS的统一手势库感兴趣。