【问题标题】:Pausable buffer with RxJS使用 RxJS 的可暂停缓冲区
【发布时间】:2019-07-16 16:03:42
【问题描述】:

我正在尝试使用 RxJS 流实现可切换的自动保存功能。目标是:

  • 启用自动保存后,将更改发送到服务器。
  • 禁用自动保存时,缓冲更改并在重新启用自动保存时将其发送到服务器。

这是我遇到的:

autoSave$ = new BehaviorSubject(true);
change$ = new Subject();

change$.pipe(
  bufferToggle(
    autoSave$.pipe(filter(autoSave => autoSave === false)),
    () => autoSave$.pipe(filter(autoSave => autoSave === true)),
  ),
  concatMap(changes => changes),
  concatMap(change => apiService.patch(change)),
).subscribe(
  () => console.log('Change sent'),
  (error) => console.error(error),
);

感谢bufferToggle,我能够在autoSave 关闭时缓冲更改并在重新启用时发送它们。

问题是当autoSave 被启用时,什么都没有通过。我理解这是因为bufferToggle 忽略了即将到来的流量,而其开放的 observable 没有发出。

我觉得我应该有一个条件来绕过bufferToggle,同时启用autoSave,但我所有的尝试都惨遭失败。

有什么想法可以实现吗?

【问题讨论】:

    标签: rxjs rxjs6


    【解决方案1】:

    我们可以使用bufferToggle(on, off)在自动保存onoff之间缓冲事件,并在off之间打开一个过滤窗口>on 使用windowToggle(off, on)。然后我们将它们合并在一起:

    const on$ = autoSave$.filter(v=>v);
    const off$ = autoSave$.filter(v=>!v);
    
    const output$ =
      Observable.merge(
        changes$
          .bufferToggle(
            off$,
            ()=>on$
          )
    
        changes$
          .windowToggle(
            on$,
            ()=>off$
          )
      )
      .flatMap(x=>x) // < flattern buffer and window
    

    https://thinkrx.io/gist/3d5161fc29b8b48194f54032fb6d2363

    上玩这个例子

    * 请注意,由于缓冲区将值包装在数组中 - 我在示例中使用了另一个 flatMap(v=&gt;v) 来解包缓冲值。您可能希望禁用此特定行以从混合了原始值的缓冲区中获取数组。

    另外,请查看我的文章“Pausable Observables in RxJS”以查看更多示例。

    希望对你有帮助

    【讨论】:

    • 成功了,非常感谢!使用windowToggle 非常优雅:)顺便说一句,您使用的游乐场很棒,我认为它会很有用。
    • @frankie567 ,很高兴它有帮助。我在那个操场上工作了一段时间,所以很高兴得到一个很好的反馈! :)
    猜你喜欢
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2011-06-17
    • 2022-11-11
    • 2023-03-07
    相关资源
    最近更新 更多