- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我像这样创建BehaviorSubject
:
private val viewStateSubject: BehaviorSubject<StateT> = BehaviorSubject.create()
后来我通过以下方式订阅它:
viewStateDisposable = viewStateSubject
.defaultIfEmpty(createInitialState())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(view::switchToState)
但它从不发出任何项目。但是如果我创建具有默认值的主题,如下所示:
private val viewStateSubject: BehaviorSubject<StateT> = BehaviorSubject.createDefault(createInitialState())
并从订阅中删除defaultIfEmpty
,然后它会发出默认值。 AFAIK这是因为默认情况下BehaviorSubject是用EMPTY
值初始化的,所以它实际上永远不会是空的。
不幸的是我无法使用第二种解决方案。那我怎样才能切换到默认值呢?请注意,我希望能够多次订阅和取消订阅同一主题,并且仅在第一次订阅时接收默认值。这意味着我无法立即将默认值传递给主题或先跳过
。
最佳答案
AFAIK it is because by default
BehaviorSubject
is initialized withEMPTY
value, so it is never actually empty.
不,如果在没有默认项的情况下创建,BehaviorSubject
不会发出任何内容。这就是为什么它在你的情况下永远不会发出任何东西。
关于defaultIfEmpty()
:
defaultIfEmpty()
仅当 Observable
完成且不发出任何项目时才会生效。因此,只有调用 onCompleted()
才会起作用。完成发射项目后,在您的 viewStateSubject
上。
Notice that I want to be able to subscribe and unsubscribe to the same subject multiple times and receive default value only on the first subscription.
我认为带有默认项的 BehaviorSubject.create()
或 defaultIfEmpty()
都不能为您实现此目的。
BehaviorSubject.create()
使用默认项:只要没有显式发出的项目,无论是否是第一次订阅,这将始终发出该默认值。
defaultIfEmpty()
:如前所述,只有在 BehaviorSubject
完成且未发出任何项目的情况下,这才会生效。
编辑:在评论中澄清后:
您可以先发出默认项目。每个新订阅者都会收到该项目,除非发出任何其他项目。
来自doc :
Subject that emits the most recent item it has observed and all subsequent observed items to each subscribed Observer.
viewStateSubject.onNext(createInitialState());
viewStateDisposable = viewStateSubject
.observeOn(AndroidSchedulers.mainThread())
.subscribe(view::switchToState)
关于java - BehaviourSubject 不被视为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49950645/
我正在尝试模拟组件测试中的服务依赖项,该服务具有我试图模拟的行为主题属性。 我的服务如下: export class DatePickerService { public date: moment
我像这样创建BehaviorSubject: private val viewStateSubject: BehaviorSubject = BehaviorSubject.create() 后来我通
我正在使用 BehaviourSubject纯粹作为触发器,所以有效载荷并不重要。主题应该在订阅时“触发”(调用 next )(一个简单的 Subject 是行不通的!)。原则上有一个 Behavio
我正在构建一个 Angular2 应用程序,并且有两个 BehaviourSubjects我想在逻辑上合并为一个订阅。我正在发出两个 http 请求,并希望在它们都返回时触发一个事件。我在看 fork
我有 BehaviourSubject,我想用最后发出的值刷新项目。我可以在下面做例子, func refreshCurrent() { do { let items = t
我正在开发一项用户服务,通过用户的 user_id 跟踪用户。它首先检查 user_id 是否存在于他们的 cookie 中,如果不存在,它会向 api 发出获取请求以创建一个新的并在响应中返回 id
我正在尝试使用 Angular 服务通过可观察来存储和通信数据。 这是我的服务 public _currentLegal = new BehaviorSubject({ name: 'init',
我有一个带有 Angular 和 typescript 的简单表格。我将表数据从父类发送到子类(包括表),在此示例中数据名称是 _domainData。它正在正确获取数据,但我想在表上显示它,但我不知
我是 Rxjs 新手我正在尝试了解 BehaviourSubject下面是我的代码 export interface State { items: Items[] } const defaul
使用流构建器并将其流设置为 BehaviourSubject 的流,无论何时重建父窗口部件并调用 streamBuilder 的构建器函数,快照连接状态都在等待,尽管流中有以前的数据,但快照具有没有数
有一项服务用于读取初始持久值 - “settings”,并通过可观察的“settings$”将它们提供给订阅者 - 组件。多个组件使用“settings$”可观察值来检索初始持久值并进一步在它们之间交
我是 swift 和 rxSwfit 世界的新手,我正在寻求对当前解决方案的建议或批评,例如同步博客文章、类别、作者或我们需要的任何内容。 以这种经典情况为例:一个可观察量向每个订阅者提供模型中存在的
前几天我注意到了一些事情。我订阅了 @ngrx/effects 中的 Actions 流。我注意到(对我来说是一个问题)一个组件,它订阅 Actions 晚了,接收到最后一个调度的 Action 。我
因此,我有一个使用从服务中获取的数据填充的表,该服务器内的方法连接到 NodeJS API。 我尝试在我的服务上使用 BehaviourSubject,但我将其初始化为未定义,因为数据是从后端获取的:
当我测试我的代码时,我不小心遇到了意想不到的突变......或者也许......我只是做错了...... 用户 constructor( public id: number, public educa
目前我正在使用 RxKotlin 在 Kotlin 中构建一个项目。我的 Rx 背景主要基于 RxJS。 我经常用于在 Typescript 中创建热可观察对象的模式看起来类似于: private
我是一名优秀的程序员,十分优秀!