Как пропустить слишком частые события мыши в RxJS 5 (бета)?

Я использую RxJS 5 (beta10) в проекте. Большинство моих событий происходит с помощью мыши или сенсорного перетаскивания, и мне нужно будет услышать только последнее.

т. е. как мне сделать поток с потерями в RxJS5?

Запуск демонстраций на некоторых планшетах ясно показывает «перетаскивание», которое происходит, когда обновление графики занимает больше времени, чем запуск события из браузера (что не является непрерывным, даже само по себе — браузеры, кажется, оптимизируют интервал, в котором они фактически сообщают об изменениях). ).

С потоком данных с потерями я мог бы сделать так, чтобы пользовательский интерфейс всегда не отставал от пальца.


Изменить:

Этот ответ, кажется, довольно хорошо подводит итог текущему состоянию противодавления RxJS5.


person akauppi    schedule 25.07.2016    source источник
comment
Обратите внимание, что с тех пор обратное давление было удалено в RxJS 5, поскольку у него есть несколько проблем.   -  person paulpdaniels    schedule 28.07.2016
comment
Спасибо @paulpdaniels, но я не обязательно ищу здесь истинное обратное давление. «Контролируемого» RxJS4 было бы достаточно, и я думаю, что найду решение на этих выходных. Выложу здесь, конечно.   -  person akauppi    schedule 30.07.2016


Ответы (2)


Метод RxJS5 auditTime кажется подходящим мой счет.

Проблема с дросселем RxJS 4 заключалась в том, что он выдавал первое значение определенного временного окна, а при перетаскивании я очень хотел последнее (пропуская промежуточные значения, если скорость рендеринга устройства низкая). audit и auditTime обеспечивают именно это.

Осталось проверить эффект. Я изменяю графику SVG в своем обработчике событий, и я не уверен, сколько времени потребуется, чтобы эти изменения действительно стали видны на экране. Простым решением было бы настроить параметр auditTime пользователем - на медленном планшете он может быть немного больше, чем на рабочем столе. В идеале я бы нашел способ увидеть, когда рендеринг в браузере завершен, и только тогда запрашивать новые координаты.

person akauppi    schedule 30.07.2016

Существует множество различных возможных решений, поскольку существует множество определений потока с потерями. Вы можете захотеть усреднить точки перетаскивания или увидеть только первую или последнюю за период.

Например, throttle позволит вам выбрать только первое наблюдаемое значение в течение периода с повторяющимися периодами:

Документация по репозиторию rxjs на github

Возвращает Observable, который испускает только первый элемент, испускаемый исходным Observable в течение последовательных окон времени заданной продолжительности.

По сути, если вы хотите подождать, пока входные сигналы не затихнут в течение определенного периода времени, прежде чем предпринимать какие-либо действия, вам нужно устранить дребезг. Это дает вам ощущение типа «завершенного промежуточного потока».

Если вы вообще не хотите ждать, но не хотите обрабатывать более 1 наблюдаемого значения в течение определенного периода времени, вам потребуется дроссель.

Возможны более сложные алгоритмы «с потерями», но они сильно зависят от вашего конкретного варианта использования, контролируете ли вы частоту обновления кадров или, по крайней мере, можете ли вы подключиться к ней и многое другое.

person Ben Dadsetan    schedule 28.07.2016
comment
Спасибо, Бен. Я просто хотел получить последнее значение, когда рендеринг, вызванный предыдущим, завершился. auditTime приближает меня к этому, как объясняется в моем ответе. - person akauppi; 31.07.2016