【问题标题】:Selectively subscribing to an Observable based on a property in it根据其中的属性选择性地订阅 Observable
【发布时间】:2017-10-10 18:24:00
【问题描述】:

所以基本上我有一个Observable,当其中的给定属性设置为true时,我想订阅它。

情况是我将搜索结果存储在redux 状态,并将它用于我的快速搜索组件和完整结果组件。每次击键的快速搜索自动搜索(带去抖动)和“快速结果”显示在下拉列表中。当您按 Enter 键(或单击“搜索”按钮)时,您将被重定向到完整结果,当在完整结果中,如果用户在快速搜索中搜索新内容直到他按 Enter 键,我不想更新完整结果.所以这就是状态:

state = {
    fullResults: boolean,
    results: SearchResult
}

我找到了takeWhile 方法,并认为这意味着我只会在条件为真时订阅,因此尝试了这个:

search$.takeWhile((state) =>  state.fullResults).subscribe((state) => {
  this.search = state;
})

但是,这仍然会订阅每个更改。我不确定我是否误解了takeWhile 的使用,或者我是否执行错误。如果这是预期目的,我做错了什么?如果没有,还有其他方法可以实现吗?

旁注

我正在使用@angular-redux/store,它有一个很棒的@select 装饰器,我注意到它有一个comparable 参数,这也可以用来选择性地订阅吗?

【问题讨论】:

  • 创建一个新的 observable,它根据所需的属性过滤底层 observable,然后订阅它:search$.filter(state => state.fullResults).subscribe(...
  • @torazaburo 你介意用一个更完整的例子来回答你的意思吗?
  • 当询问由您的代码引起的问题时,如果您提供人们可以用来重现问题的代码,您将获得更好的答案。尽可能少地使用仍然会产生相同问题的代码。见How to create a Minimal, Complete, and Verifiable example
  • “基于其中的属性选择性订阅”的问题是有问题的。如果不订阅,代码无法知道其中的内容。
  • @georgeawg 因为我不确定这是否是由我的代码引起的问题(我只是问是否可能,如果可能,如何)我不认为把所有时间都花在一个更具描述性的例子是值得的。单独的案例场景应该足以回答这个问题,但我添加了一个示例以使其更容易。但可以肯定的是,我明白你的意思,并会努力改进这个例子。

标签: angular typescript redux rxjs observable


【解决方案1】:

所以基本上我有一个 Observable,我只想在其中的给定属性设置为 true 时订阅它。

您以错误的方式陈述了问题。你应该说的是:

我有一个 Observable,我只想订阅其中给定属性为 true 的元素。

“只有那些元素”是由filter 操作符实现的,它应用于一个可观察对象,并产生一个过滤的可观察对象。所以要完成你想要的,创建一个新的 observable,它根据所需的属性过滤底层的 observable,然后订阅它:

// Create a filtered observable.
const filteredSearch$ = search$.filter(state => state.fullResults);

// Subscribe to the filtered observable.
filteredSearch$.subscribe(state => this.search = state);

【讨论】:

  • 感谢您添加答案,但这实际上与评论中的文本完全相同。我想知道新的 Observable 在这个场景中的位置?
  • @Jan-ErikLysander 您的评论:我想知道新的 Observable 在这个场景中的位置?,因为您基本上已经提供了,所以不可能告诉您任何事情没有代码,所以我们无法猜测您的代码是什么样子,并告诉您将任何代码块放在哪里,除非您提供 stackoverflow.com/help/mcve 就像评论中已经提到的那样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
相关资源
最近更新 更多