Как отменить составленный наблюдаемый RxJS

Ребята, у меня есть приложение, использующее RxJS для обработки событий мыши. Я складываю эти события в более сложные наблюдаемые «жесты». Один из таких жестов - «встряхнуть».

Я пытаюсь составить следующие серии событий:

mousedown  
mousemove left  
mousemove right  
mousemove left  
mousemove right  
mouseup

Я обнаружил, что

mousedown  
mouseup
mousemove left  
mousemove right  
mousemove left  
mousemove right  

также вызывает тот же результат.

Я сделал скрипку, демонстрирующую проблему на codepen.

Мой вопрос в целом: как вы выражаете в RxJS, что наблюдаемый объект, такой как mouseup, должен отменять и перезапускать состав наблюдаемого?

В качестве еще одного примера проблемы (из той же скрипки) следующие события

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

Результат в 3 событиях встряхивания. Я бы хотел, чтобы это привело к одному.


person bnieland    schedule 06.07.2014    source источник


Ответы (1)


Используйте 1_

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,...
person Brandon    schedule 06.07.2014
comment
Просто перечитайте этот ответ через 18 месяцев и узнайте что-то новое (flatMapLatest). У меня есть новый вопрос, если вы не против взглянуть. stackoverflow.com/ questions / 34890358 / - person bnieland; 20.01.2016