Angular RxJs:从可观察值中获取最后一个或默认值

时间:2019-06-05 06:37:00

标签: angular typescript rxjs

我已经通过Observable按钮事件创建了一个"click"

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

因此,当单击“编辑”按钮时,表示用户正在编辑:

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

“编辑”按钮时出现问题

    尚未点击
  1. (默认值必须为false),或者
  2. 订户应该收到最后发出的值。

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

返回默认值:

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

它与share()运算符相似,但是share() === multicast(() => new Subject()).refCount()

我建议您看看这个link

答案 1 :(得分:0)

我读到您的第二个要求是:“当新订户订阅时,他希望立即获得最新的价值”。然后将这样做:

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
);

如果这不是您的第二个要求,请弄清楚您的用例到底是什么。

答案 2 :(得分:0)

我很高兴选择从fromEvent中创建一个Observable(建议您显示信号的语法和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),用于缓冲所有输入,并且仅在经过反跳毫秒后才发出。您可以在其后添加一个take(1),以使其更完整。

也许您可以扩展用例,我们可以帮助您确定哪些运算符或它们的组合会有所帮助。

答案 3 :(得分:0)

我猜你不想要startWith(false)因为订阅者可能会得到2个发射,而你只想要1个发射。 怎么样:

this.editing$ = editClick$.pipe(
mapTo(() => true),
defaultIfEmpty(false),
);