如何在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的统一手势库感兴趣。