我试图将一个完整的链接到我的Rx链中,当我这样做时,链永远不会在onError或onComplete中完成。
当我单步执行代码时,我的可完成代码就会被执行。我甚至可以添加日志记录并看到它登录到它自己的doOn完成()
下面将记录“我已完成”,但不会进入错误或完成回调。
profileRepo.getLocalProfileIfAvailableElseRemote()
.flatMapCompletable { profile ->
userRoutingRepo.disableRule(profile.account_uid, userRoutingRule.id)
.doOnComplete {
Log.i("I COMPLETED", "I COMPLETED")
}
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(
onError = { error ->
//do error
},
onComplete = {
//do success
}
).addTo(disposable)
如果我改为使用flatMap并使用andThen返回布尔可观测值,它将起作用
profileRepo.getLocalProfileIfAvailableElseRemote()
.flatMap { profile ->
userRoutingRepo.disableRule(profile.account_uid, userRoutingRule.id)
.doOnComplete {
Log.i("I COMPLETED", "I COMPLETED")
}.andThen(Observable.just(true))
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(
onError = { error ->
//do error
},
onNext = {
//do next
}
).addTo(disposable)
我尝试在flatMapCompletable版本中添加“and then”并调用Completable。complete()但这也不行吗?
我不明白为什么completable正在完成,但拒绝使用flatMapCompletable?
编辑:这是我的完整尝试的更新,但不起作用
注意用户路由服务。disableRule(accountUid,ruleId)是改装接口
profileRepo.getLocalProfileIfAvailableElseRemote()
.flatMapCompletable { profile ->
userRoutingRepo.disableRule(profile.account_uid, userRoutingRule.id)
.andThen(Completable.complete())
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(
onError = { error ->
Log.i("TAG", "ERROR")
},
onComplete = {
Log.i("TAG", "COMPLETE")
}
).addTo(disposable)
override fun disableRule(accountUid: String, ruleId: String): Completable {
return activeStateToggler(userRoutingSourceApi.disableRule(accountUid, ruleId),
ruleId,
false)
}
override fun disableRule(accountUid: String, ruleId: String): Completable {
return userRoutingService.disableRule(accountUid, ruleId)
.doOnError { error ->
authenticationValidator.handleAuthenticationExceptions(error)
}
}
private fun activeStateToggler(completable: Completable,
ruleId: String,
stateOnSuccess: Boolean
): Completable {
return completable
.doOnSubscribe {
stateTogglingInProgress.add(ruleId)
}
.doOnComplete {
stateTogglingInProgress.remove(ruleId)
getLocalUserRule(ruleId)?.active = stateOnSuccess
stateTogglingInProgressPublishSubject.onNext(UserRoutingStateToggleSubjectType.Success)
}
.doOnError {
stateTogglingInProgress.remove(ruleId)
stateTogglingInProgressPublishSubject.onNext(UserRoutingStateToggleSubjectType.Error(
it))
}
}
使用flatMapCompletable时,需要返回Completable。自己完成()。
编辑:
profileRepo.getLocalProfileIfAvailableElseRemote()
.flatMap { profile ->
userRoutingRepo.disableRule(profile.account_uid, userRoutingRule.id)
.doOnComplete { Log.i("I COMPLETED", "I COMPLETED") } }
.flatMapCompletable { () -> { Completable.complete() } }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(
onError = { error ->
//do error
},
onNext = {
//do next
}
).addTo(disposable)
编辑2:因为一次性规则
是一个完整的
profileRepo.getLocalProfileIfAvailableElseRemote()
.flatMapCompletable { profile ->
userRoutingRepo.disableRule(profile.account_uid, userRoutingRule.id)
.doOnComplete { Log.i("I COMPLETED", "I COMPLETED") }
.andThen(Completable.complete().doOnCompleted { Log.i("comp2", "comp2")) }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(
onError = { error ->
//do error
},
onNext = {
//do next
}
).addTo(disposable)
编辑3:工作样本
Observable.just(1)
.flatMapCompletable { profile ->
Completable.complete()
.doOnComplete { Log.i("I COMPLETED", "I COMPLETED") }
.andThen(Completable.complete().doOnComplete { Log.i("I COMPLETED", "I COMPLETED 2") })}
.subscribeBy(
onError = { error ->
},
onComplete = {
Log.d("I COMPLETED", "I COMPLETED 3")
})
这就是flatMapCompletable所做的:
将上游可观察的每个元素映射到CompletableSources中,订阅它们并等待上游和所有CompletableSources完成。
使用flatMapCompletable时,返回的Completable将等待上游的可观察终端事件(onComplete)。
使用flatMapCompletable时,仅当您确定链中的所有内容都已完成时才使用它。
在您的情况下,它不起作用,因为您的源Observable是热的,并且永远不会完成。
我继续玩Retor,现在我看到运算符的行为完全类似于,我想知道是否有任何我不明白的区别。 这两个示例的行为和返回的结果相同。 问候。
在阅读了关于表达式的这个极好的答案之后,我尝试将我的<code>平面图</code>转换为表达式</code>的<code>。 然后,for-expression。 我得到一个编译时错误 我的for表达式怎么了?
我有一个场景,我需要定期调用一个应用编程接口来检查结果。我使用来创建一个调用应用编程接口的间隔函数。 然而,我有背压的问题。在我下面的例子中,间隔中的每个记号都会创建一个新的单曲。理想的效果是仅在调用尚未进行时调用API 我可以使用过滤器变量来解决这个问题: 但是它看起来像一个黑客解决方案。我已经厌倦了在函数之后应用,但是它没有效果。 有什么建议吗?
问题内容: 我目前的理解非常模糊,我倾向于认为map是同步的,而flatMap是异步的,但是我真的无法解决它。 这是一个例子: 我有文件(a ),我想将其复制到服务器上的某些文件中。 本示例摘自一本书。 我可以将所有更改为to ,反之亦然,一切仍然正常。我不知道有什么区别。 问题答案: 用于同步,非阻塞,一对一转换 用于异步(非阻塞)1-to-N转换 区别在方法签名中可见: 取a 并返回a 取a
我试图使用for理解以下内容: 我试过这个: 有没有办法用< code > for-comprehensive 简洁地写进去?
你好 在这里,我做了两个元素的通量,然后通过平面图公开第一个异常,第二个通量。 使用onErrorResume,我希望输出 但什么也得不到。谁能解释一下为什么会这样? 谢谢