2016-07-21 2 views
3

Я пытаюсь захватить событие long-press в примере модели. См. Код ниже:Обнаружение длинного интервала между событиями с помощью RxJS

var Rx = require('rx'), 
Observable = Rx.Observable; 

var downEvents = [ 
// {'type': 'down', 'time': 50}, 
// {'type': 'down', 'time': 80}, 
// {'type': 'down', 'time': 140}, 
    {'type': 'down', 'time': 250} 
]; 

var upEvents = [ 
// {'type': 'up', 'time': 60}, 
// {'type': 'up', 'time': 90}, 
// {'type': 'up', 'time': 150}, 
    {'type': 'up', 'time': 850} 
]; 

var downStream = Observable.from(downEvents).flatMap(function(event) { 
    return Observable.just(event.type).delay(event.time); 
}); 

var upStream = Observable.from(upEvents).flatMap(function(event) { 
    return Observable.just(event.type).delay(event.time); 
}); 

var longClicks = downStream.flatMap(function(d) { 
    return Observable.just(d).delay(400).takeUntil(upStream); 
}); 

longClicks.subscribe(function(x) { 
    console.log('long click: ' + x); 
}); 

И он фиксирует это единственное событие. Но если я раскомментирую предыдущие события, он ничего не получит. Может ли кто-нибудь помочь мне понять, почему это так?

С событиями UI и тот же код работает отлично: https://jsfiddle.net/zjor/0uqaw936/

ответ

1

это из-за takeUntil, поэтому этот код Observable.just(d).delay(400).takeUntil(upStream); средства получить элементы из этой наблюдаемой Observable.just(d).delay(400) до тех пор, upStream производит значение. Если задержка слишком велика, тогда восходящий поток будет выдавать все значения до истечения задержки. Поэтому на консоль не было напечатано никаких инструкций. Пример

Давайте ваш код еще раз:

С помощью этого экземпляра, установить время задержки до 59 и консольное заявление распечатывается

var downEvents = [{ 
     'type': 'down', 
     'time': 50 
    }, 


]; 

var upEvents = [{ 
    'type': 'up', 
    'time': 60 
}, ]; 

var downStream = Rx.Observable.from(downEvents).flatMap(function(event) { 
    return Rx.Observable.just(event.type).delay(event.time); 
}); 

var upStream = Rx.Observable.from(upEvents).flatMap(function(event) { 
    return Rx.Observable.just(event.type).delay(event.time); 
}); 


var longClicks = downStream.flatMap(function(d) { 
    console.log(d); 
    return Rx.Observable.just(d).delay(59).takeUntil(upStream); 
}); 

longClicks.subscribe(function(x) { 
    console.log('long click: ' + x); 
}); 

Если изменить время задержки затем нет выхода

var downEvents = [{ 
     'type': 'down', 
     'time': 50 
    }, 


]; 

var upEvents = [{ 
    'type': 'up', 
    'time': 60 
}, ]; 

var downStream = Rx.Observable.from(downEvents).flatMap(function(event) { 
    return Rx.Observable.just(event.type).delay(event.time); 
}); 

var upStream = Rx.Observable.from(upEvents).flatMap(function(event) { 
    return Rx.Observable.just(event.type).delay(event.time); 
}); 


var longClicks = downStream.flatMap(function(d) { 
    console.log(d); 
    return Rx.Observable.just(d).delay(61).takeUntil(upStream); 
}); 

longClicks.subscribe(function(x) { 
    console.log('long click: ' + x); 
}); 
Смежные вопросы