如何取消组合的RxJS可观察量

时间:2014-07-06 17:12:36

标签: system.reactive reactive-programming rxjs reactive-extensions-js

伙计们,我有一个使用RxJS处理鼠标事件的应用程序。我正在将这些事件组合成更复杂的可观察的手势'。一个这样的姿势是"摇动"。

我想要撰写的一系列事件是:

mousedown  
mousemove left  
mousemove right  
mousemove left  
mousemove right  
mouseup

我发现的是

mousedown  
mouseup
mousemove left  
mousemove right  
mousemove left  
mousemove right  

也会触发相同的结果。

我做了a fiddle demonstrating the issue on codepen

我的问题一般是:你如何在RxJS中表达一个obeservable,比如mouseup,应该取消并重新启动一个observable的组合?

作为问题的另一个例子(来自同一个小提琴),以下事件

mousedown  
mouseup
mousedown  
mouseup
mousedown  
mousemove left  
mousemove right  
mousemove left  
mousemove right  

导致3次震动事件。我希望它能产生一个。

1 个答案:

答案 0 :(得分:4)

使用takeUntil

var down = $div.onAsObservable('mousedown');
var up = $div.onAsObservable('mouseup');
var move = $div.onAsObservable('mousemove');

var shake = down.flatMapLatest(function (downev) {
            var current = downev;
            return move
                .map(function (ev) {
                    var delta = ev.pageX - current.pageX;
                    current = ev;
                    return delta < 0 ? 'left' : 'right';
                 })
                .takeUntil(up)
                .toArray();
        })
        .subscribe(function (moves) {
            // see if moves is an array of left,right,...