2015-05-27 2 views
2

Как вы это делаете? RxJs по-прежнему остается загадкой для меня.RxJs - повторить все события после каждого всплеска событий

Я пытался вещи, как:

filterChanges 
    .delay(400) 
    .replay() 
    .reduce(function(acc,x) { return acc.concat(x) }, []) 
    .subscribe(function(changes) { 
     console.log(changes); 
     ... 

Или

filterChanges.subscribe(function() { 
    filterChanges.aggregate(function(changes) { 
      ... 

Я действительно очень потерял здесь. Поведение, которое я хочу: некоторые действия пользователя приводят к нескольким изменениям фильтра. Я не хочу обрабатывать их по одному, но только когда завершение изменений завершено. Но когда я их обрабатываю, я хочу, чтобы все изменения фильтра начинались с начала потока.

Теперь, когда я пишу это, я понимаю, что было бы лучше просто получить все фильтры после всплеска изменений, не все изменения сами, поэтому мне просто нужно поймать конец рывка. Я бы хотел ответить на оба вопроса, потому что я думаю, что это поможет мне лучше понять RxJs.

  1. Подпишитесь на рассылку событий.
  2. Подпишитесь на конец всплеска событий и запишите все события из начала потока.
+1

Похоже, что вам нужна комбинация буфера и сканирования. Буфер для группировки всех действий, которые происходят в течение заданного периода времени, и Сканирование для использования этого буферизованного потока и сохранения списка, который накапливает все наблюдаемые значения. – Chris

+1

Можете ли вы уточнить, что вы имеете в виду под «фильтрами»? –

+0

Мой вариант использования: Фильтры принимают простую форму атрибута/значения: поэтому фильтр 'state -> Texas 'исключает все записи, в которых находится штат Техас. Я использую ту же схему с фильтрами даты, потому что в моих данных имеется небольшое количество отдельных дат. Поэтому, если пользователь меняет дату начала или окончания, чтобы включить, фильтры для нескольких отдельных дат могут быть установлены или удалены сразу. Всякий раз, когда меняются фильтры, я просматриваю все настройки записей или отменяет флаг .hidden. Но если пользователь отключает некоторые фильтры (например, расширяет диапазон дат), я не могу отображать записи, которые все еще скрыты каким-либо другим фильтром. – Sigfried

ответ

3

Если я правильно понял, используйте buffer в сочетании с debounce. Буфер предоставит вам список событий, произошедших во время окна буфера, и debounce определит, когда окно буфера должно быть закрыто, так вы можете получить все события в рывке. Чтобы получить все события с самого начала потока, вы получите scan, чтобы скопировать все списки из буферов.

var hotFilterChanges = filterChanges.share(); 

hotFilterChanges 
    .buffer(hotFilterChanges.debounce(200)) 
    .scan((acc, curr) => acc.concat(curr)) 
    .subscribe(x => console.log(x)); 

Мы используем .share() сделать Наблюдаемые быть "горячим". Это необходимо, так что hotFilterChange.buffer(...) и hotFilterChanges.debounce(200) относятся к точному исполнению.

See the JSBin.

+0

Спасибо! Я думаю, что это, должно быть, была «горячая» вещь, которая меня путала. Я бы дважды ссылался на мой поток и получал совершенно разные результаты. Кроме того, я забыл сказать в вопросе, что я использовал ReplaySubject. Думаю, с вашим ответом, это не обязательно. – Sigfried

+0

Не уверен, что это будет важно для всех, но мне пришлось изменить '.scan ((acc, curr) => acc.concat (curr))' to '.scan ([], (acc, curr) =>. ..), т. е. дать ему начальное значение. Без этого сканирующий накопитель не будет работать в первый раз, и я поставил там некоторый код, который мне нужно было запустить. – Sigfried

Смежные вопросы