gpt4 book ai didi

rxjs - 如何使 RxJS 中的事件超时?

转载 作者:行者123 更新时间:2023-12-01 01:12:21 25 4
gpt4 key购买 nike

我正在尝试检测 mousedown 事件是否在 mouseup 之前持续了一段时间。

我在使用 fromEvent() 创建的 Observable 上使用 timeout() 来执行此操作,但超时会返回两个 Observable。

下面,如果 mousedown 在 1 秒内被触发,订阅流返回事件,但它也返回 1。

var mousedown = Rx.Observable.fromEvent(target, 'mousedown');
var stream = mousedown.timeout(1000, Rx.Observable.return(1));

var sub = stream.subscribe(
function (x) {
console.log('Next: '+x);
},
function (err) {
console.log('Err: '+err);
},
function () {
console.log('Complete');
}
);

但是,这按预期工作:

var source = Rx.Observable.return(42)
.delay(200)
.timeout(1000, Rx.Observable.return(1));

我希望这段代码能够工作:

var mousedown = Rx.Observable.fromEvent(target, 'mousedown');
var mouseup = Rx.Observable.fromEvent(target, 'mouseup');

var clickhold = mousedown
.flatMap(function (){
return mouseup.timeout(1000, Rx.Observable.return('hold'));
})
.filter(function (x) {
return x === 'hold';
});

clickhold.subscribe(
function (x) {
console.log('Next: '+x);
},
function (err) {
console.log('Err: '+err);
},
function () {
console.log('Complete');
}
);

最佳答案

而不是使用 timeout , 我用过 delaytakeUntil :

var target,
mousedown,
mouseup;

target = document.querySelector('input');

mousedown = Rx.Observable.fromEvent(target, 'mousedown');
mouseup = Rx.Observable.fromEvent(target, 'mouseup');

var clickhold = mousedown
.flatMap(function(){
// Triggered instantly after mousedown event.
return Rx.Observable
.return('hold')
.delay(1000)
// Discards the return value if by the time .delay() is complete
// mouseup event has been already completed.
.takeUntil(mouseup);
});

clickhold.subscribe(
function (x) {
console.log('Next: ' + x);
},
function (err) {
console.log('Err: ' + err);
},
function () {
console.log('Complete');
}
);
<script src='https://rawgit.com/Reactive-Extensions/RxJS/v.2.5.3/dist/rx.all.js'></script>

<input type='button' value='Button' />

关于rxjs - 如何使 RxJS 中的事件超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23985416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com