RxJs. Как дождаться другого наблюдаемого, если он сработал недавно

В основном у меня есть две подписки, которые время от времени запускают события.

Первый довольно простой, он загружает и отображает некоторые данные:

observableOne$.switchMap(event => {
  return loadData(event);
}).subscribe(data => {
  displayData(data);
});

Второе преобразование отображает данные, и преобразование должно выполняться только один раз:

observableTwo$.subscribe(event => {
  transformDisplayedData(event);
});

Проблема, с которой я столкнулся, заключается в том, что если второе событие запускается сразу после первого, преобразование теряется. И я не могу подать заявку повторно, это одноразовое действие.

Есть ли способ отложить преобразование, если observableOne$ запущен недавно?

Временная последовательность будет выглядеть так:

One      : -a----------a----->
Two      : -----b------b----->
Display  : ---a----------a---> // lag is due to async data loading
Transform: -----b--------b--->

ИЗМЕНИТЬ

Я создал скрипку с демонстрацией. Фактическая временная последовательность может быть записана так:

PageClick      : -x----------x----->
HighlightClick : -----x------x----->
DataRender     : ---x----------x--->
DataHighlight  : -----x------x----->

Когда PageClick и HighlightClick объединяются, данные выделяются и отображаются через секунду. Но я хочу отложить выделение, отсюда желаемая временная последовательность:

PageClick      : -x----------x----->
HighlightClick : -----x------x----->
DataRender     : ---x----------x--->
DataHighlight  : -----x--------x--->

person Sergey Sokolov    schedule 03.11.2016    source источник
comment
Как, почему и когда вы запускаете observableTwo$, если вы знаете, что он срабатывает сразу после observableOne$, а вы знаете, что этого не должно быть? Существуют такие операторы, как throttle() или debounce(), но трудно дать вам совет, если неочевидно, что делает ваш код.   -  person martin    schedule 03.11.2016
comment
@Martin, А с диаграммой последовательности понятнее?   -  person Sergey Sokolov    schedule 03.11.2016
comment
Почему нельзя поставить transformDisplayedData(event); прямо перед displayData(data);?   -  person martin    schedule 03.11.2016
comment
@Martin, ты имеешь ввиду в subscribe для observableOne$? Потому что трансформация контролируется вторым событием. И если первое событие происходит без второго, то преобразование не требуется.   -  person Sergey Sokolov    schedule 03.11.2016
comment
Мне непонятно, в чем цель, даже со схемой. Но я думаю, что вы отвечаете, используя .share () или ReplaySubject.   -  person D. Walsh    schedule 17.11.2016
comment
@ D.Walsh Проверьте эту скрипку. При нажатии кнопки «обе» подсветка теряется вскоре после ее применения.   -  person Sergey Sokolov    schedule 18.11.2016
comment
Спасибо за скрипку! Я не понимаю, какое действие - одно, а какое - два. Что касается скрипки, какова релевантная последовательность, что она делает сейчас и что должна делать?   -  person D. Walsh    schedule 21.11.2016
comment
@ D.Walsh Я хочу отложить выделение до тех пор, пока не появятся новые данные.   -  person Sergey Sokolov    schedule 23.11.2016
comment
Дублировать на основе принятого ответа? stackoverflow.com/questions/40636035/   -  person subhaze    schedule 30.12.2016
comment
@subhaze, да ты прав   -  person Sergey Sokolov    schedule 31.12.2016


Ответы (1)


Если кому-то интересно, это можно сделать путем введения промежуточного потока, через который проходят события start loading и end loading. Дополнительные сведения см. В этом вопросе

person Sergey Sokolov    schedule 29.11.2016