3

mousedownの前にイベントが一定期間開催されているかどうかを検出しようとしていmouseupます。

そのために作成された Observable で timeout() を使用しfromEvent()ていますが、タイムアウトは両方の Observable を返します。

以下では、ストリームにサブスクライブすると、mousedown1 秒以内にトリガーされた場合にイベントが返されますが、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');
    }
);
4

2 に答える 2