Угловые RxJs: получить последнее значение или значение по умолчанию из наблюдаемого - PullRequest
1 голос
/ 05 июня 2019

Я создал событие Observable из "click" кнопки:

let editClick$ = Observable.fromEvent(this.editButton.nativeElement, 'click');

Итак, когда нажата кнопка «Изменить», это означает, что пользователь редактирует:

this.editing$ = editClick$.pipe(map(() => true));

Проблема возникает, когда кнопка "edit"

  1. не была нажата (значение по умолчанию должно быть false), или
  2. подписчик должен получить последнее отправленное значение.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 05 июня 2019

Для того чтобы сделать значение по умолчанию, возвращается:

this.editing$.pipe(publishBehavior(), refCount());

Это похоже на оператор share(), но share() === multicast(() => new Subject()).refCount()

Полагаю, вы посмотрите на эту ссылку .

0 голосов
/ 05 июня 2019

Я вполне доволен вашим выбором создать Observable из fromEvent (учтите, синтаксис, который вы показываете сигналы, и более старую (устаревшую) версию RxJS, какую версию вы используете? Я буду использоватьпоследняя версия для моих примеров)

Я думаю, что для вашего первого вопроса вам понадобится startWith().

https://github.com/ReactiveX/rxjs/blob/master/src/internal/operators/startWith.ts

Вы будете использовать его так:

fromEvent(this.editButton.nativeElement, 'click').pipe(
    map(() => true),
    startWith(false)
)

Второй вопрос немного сложнее, поскольку fromEvent() Observable не complete по умолчанию.Это дает вам пару вариантов, и это будет сильно зависеть от вашего варианта использования.

Операторы, которые приходят на ум: take(x), где x - это число значений, которые нужно принять.Если это первое значение, first() также работает.

debounceTime(ms), который буферизует все входные данные и выдает только по истечении миллисекунд debounce.Вы можете добавить take(1) после этого в комбинации, чтобы завершить его после.

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

0 голосов
/ 05 июня 2019

Я прочитал вам второе требование: «Когда подписчик подписывается, он хочет немедленно получить последнее значение». Это будет сделано тогда:

this.editing$ = editClick$.pipe(
  map(() => true),
  startWith(false), // <- this will be the starting value
  shareReplay(1) // <- the last emitted value will be saved and emitted immediately when a new subscriber subscribes
);

Если это не то, к чему относится ваше второе требование, уточните, каков именно ваш вариант использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...