【问题标题】:How to build Observable from dynamically created and destroyed sources?如何从动态创建和销毁的源构建 Observable?
【发布时间】:2018-10-03 04:42:43
【问题描述】:

我的问题与RXJS: Single Observable from dynamically created Observables 类似(没有答案)。

我想连续解析一些页面。有一个主页,我可以在其中获取要解析的页面链接列表。此链接列表随时间而变化。然后我跟踪链接并不断解析页面,直到它们的链接从主页消失并开始解析出现在主页上的新页面。

我现在的设置如下。我有一个类,给定一个 url 可以返回一个 Observable 的连续发射项目(从主页解析单个链接)。这很好用。但是,我想要一个“主”类,它能够返回一个相同项目的 Observable,但取自多个页面。我遇到的问题是页面列表正在改变(底层Observables 的列表也是如此,我不能只使用Observable.merge

TL;DR: 我有多个要合并的Observables。但是这个Observables 列表是动态变化的,我不知道如何处理。

我该如何处理?

【问题讨论】:

  • @OlesSavluk 谢谢你的建议。不过,我不确定这与我的问题有什么关系。我想我可以使用您的答案重新定义我的链接解析器如何构造Observable,但我很难在它们被创建和销毁时合并它们。

标签: rxjs rx-java rx-java2 reactivex


【解决方案1】:

如果您已经拥有“主”页面的 Observable,以及基于此数据获取项目的功能。您可以使用switchMap 运算符来“切换”这个动态变化的列表,例如:

getMainPages().pipe(
  switchMap(main => getItemsFromMultiplePages(main))
)

地点:

  • getMainPages() - 返回主页面数据的 Observable
  • getItemsFromMultiplePages(main) - 返回可观察的项目,通过组合(可能使用 merge)来自多个页面的数据创建

【讨论】:

  • 谢谢,我认为这解决了我的问题。我在上下文中看到的主要问题是每个Observable(基本上是每个页面)在内部都使用 Selenium WebDriver 的一个实例,因此我将初始化和销毁​​很多这些对象(如果我正确理解了这个管道作品)。也许这可以通过getItemsFromMultiplePages() 函数中的某种缓存来解决。
  • 我认为你可以在这个函数中使用concat / concatMap,这样所有的动作都会按顺序完成(而不是像merge那样并行),因此可以重用WebDriver实例。您可以使用代码示例创建单独的问题以获得更详细的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 2020-02-09
相关资源
最近更新 更多