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



我从"click"按钮事件创建了一个Observable

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

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

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

"编辑"按钮时出现问题

  1. 尚未单击(默认值必须为false),或
  2. 订阅者应收到上次发出的值。

有什么想法吗?

为了使默认值返回:

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

它类似于share()运算符,但share() === multicast(() => new Subject()).refCount()

我建议你看看这个链接。

我把你的第二个要求解读为"当新订阅者订阅时,他希望立即获得最新值"。这将做到这一点:

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

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

我对你选择创建一个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),缓冲所有输入,仅在去抖动毫秒后发出。您可以在之后组合添加take(1)以使其完成后完成。

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

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

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

最新更新