【问题标题】:How do I buffer until last stream in RxJs如何缓冲直到 RxJs 中的最后一个流
【发布时间】:2020-09-10 03:44:40
【问题描述】:

到目前为止,我可以使用 buffer(observable) 进行缓冲,直到提供可观察的发射或 bufferCount(count) 等待直到一定数量的流被发射或使用 bufferTime(time)bufferToggle() 所有这些都不能解决我需要的情况缓冲直到最后一次排放并将所有排放作为数组返回?

【问题讨论】:

  • 因此,如果您有src$,pipe(buffer(notifier$)),您是否只想在notifier$ 发送其最后发出的值时接收收集的值?
  • @AndreiGătej 正确。我希望我可以创建notifier$ observable,它只会在流结束时触发,但我现在不知道。

标签: angular rxjs angular-observable


【解决方案1】:

听起来您正在寻找toArray 运算符。

来自他们的文档:

收集所有源排放,并在源完成时将它们作为数组发射。

【讨论】:

  • 问题是 toArray 操作符需要接收流的缓冲区并将其转换为数组,所以我必须在它前面加上 take 操作符来缓冲流,但需要操作符count 作为参数,在我的情况下,无论计数如何,我都需要所有流。
  • @kasongoyo toArray 不接收任何参数,它只是将所有发射收集到一个数组中,并在源 observable 完成时发射它。
  • 是的,这是真的。我想说的是 toArray() 在源代码完成之前将无法工作,因此如果源代码是由主题创建的,那么 toArray 将不起作用,但如果源代码是由 of 运算符创建的,那么它可以工作,因为of observable 迭代并立即完成订阅。
【解决方案2】:

你可以试试这个:

src$.pipe(
   buffer(notifier$.pipe(last(null, 'default value')))
)

last() 将在源完成(结束)时发出最新发出的值。我们提供了一个默认值,以防源未发出任何内容,但您仍想获取收集的值。


编辑

如果你想缓冲到source的最后一次发射,你可以试试这个:

src$ = src$.pipe(publish(), refCount());

src$.pipe(
   buffer(src$.pipe(last()))
);

publish() + refCount() 将通过在数据生产者和数据消费者之间放置一个Subject 实例来确保不会多次订阅源。


编辑 2

这是一个具体的例子:

const src$ = fromEvent(document, 'click')
  .pipe(
    take(3),
    map((_, idx) => idx + 1), 
    publish(), 
    refCount(),
  );

src$.pipe(
  buffer(src$.pipe(last()))
).subscribe(console.warn); // after clicking 3 times: [1, 2, 3]

StackBlitz.

源(src$) 不会发射并且不会同步完成,这一点很重要。如果发生这种情况,当传递给 buffer 的 observable 完成时,外部 observable 也将完成。

【讨论】:

  • last() 会在src 完成或notifier$ observable 完成时发出吗?在那种情况下,notifier$observable 是什么,因为它看起来像是在 src 之前创建的一个新的独立 observable?
  • last() 将在notifier$ 完成时发出。当src$ 完成时,将向数据消费者发送完整的通知(例如您来自obs$.subscribe(subscriber) 的订阅者)。
  • 什么是notifier$observable ... 嗯,我想我误解了你的问题。 requires to buffer until the last emission,您是指 source 的最后一次发射吗?比如:src$.pipe(src$.pipe(last(...))) ?
  • 正确。这是src$.pipe(src$.pipe(last(...))) 有效吗?
  • @kasongoyo 我添加了一个具体的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多