Android 当其中一个发生错误时终止可观测链

Android 当其中一个发生错误时终止可观测链,android,rx-java,reactivex,Android,Rx Java,Reactivex,我想一个接一个地运行一系列Rx Completable。我正在使用concat()来执行此操作,因为我不希望它们同时启动 view.welcome_message_edittext.verifyNotEmpty(getString(R.string.enter_your_email_address)) .concatWith(view.welcome_message_edittext.verifyEmailAddress()) .concatWith(sendMessageToB

我想一个接一个地运行一系列Rx Completable。我正在使用
concat()
来执行此操作,因为我不希望它们同时启动

view.welcome_message_edittext.verifyNotEmpty(getString(R.string.enter_your_email_address))
    .concatWith(view.welcome_message_edittext.verifyEmailAddress())
    .concatWith(sendMessageToBot())
    .subscribe({
        // The user has successfully entered data into the edittext, entered an email into the edittext, and sent message to bot. 
    }, { error -> })
上面的代码是这样说的,“断言用户已在EditText中输入了文本。如果这是真的,则断言用户已在EditText中输入了电子邮件。如果这两个都是真的,则向bot发送消息。”如果用户在EditText中输入了文本,但它不是电子邮件,则我预计完整表链将断开,并返回onError()有人打电话来

这就是我想发生的事。当任何completable调用
onError()
(如
verifyNotEmpty()
verifyEmailAddress()
如果用户将EditText留空或未输入电子邮件地址,则执行该操作),则我希望整个链终止并调用
.subscribe()
onError()函数

但是,查看文档中的
.concat()
这就是它的实际行为:

调用
onError
时,
concat()。链条还在继续


所以我的问题是,当任何一个completable调用
onError()
时,我需要使用什么来打破这个链条?

感谢评论中的@Buckstabue帮助我调试这个问题。他的评论是:


让我猜猜。调用verifyEmailAddress()方法是绝对正常的,我怀疑您正在observable之外执行一些业务逻辑。您可以将该逻辑放入observable中,它将被延迟计算,这类似于observable.just(getMyInteger())和observable.fromCallable(()->getMyInteger())之间的差异。在第二种情况下,将在订阅后延迟调用getMyInteger(),而立即调用第一种

返回我的代码并查看我的
verifyEmailAddress()
sendMessageToBot()
函数:

private fun sendMessageToBot(): Completable {
    insertChatMessageIntoConversation(ChatMessage(view!!. welcome_message_edittext.text.toString()))
    return Completable.complete()
}

fun EditText.verifyEmailAddress(): Completable {
    if (!android.util.Patterns.EMAIL_ADDRESS.matcher(text.trim()).matches()) {
        return Completable.error(RuntimeException("Enter a valid email"))
    } else {
        return Completable.complete()
    }
}
函数的逻辑不在可完成块内。当我编写代码时,我认为这并不重要,因为我认为Rx的行为是它执行每个Completable并等待它们完成或完全出错,然后再转到下一个Completable。因此,完全跳过
sendMessageToBot()
verifyEmailAddress()
函数。事实并非如此

这项工作:

fun EditText.verifyEmailAddress(): Completable {
    return Completable.fromCallable({
        if (!android.util.Patterns.EMAIL_ADDRESS.matcher(text.trim()).matches()) {
            val errorMessage = context.getString(R.string.enter_email_address)
            error = errorMessage
            throw RuntimeException(errorMessage)
        }
    })
}

private fun sendMessageToBot(): Completable {
    return Completable.fromCallable {
        insertChatMessageIntoConversation(sage(view!!. welcome_message_edittext.text.toString()))
    }
}

我在上一个屏幕截图中没有看到任何错误事件。错误事件在时间线上用十字标记。因此,在这方面使用concat应该是可以的case@Buckstabue我正在使用
concat()
。上面的代码片段是我应用程序中的实际代码片段。当我运行代码时,将EditText留空,然后调用
verifyEmailAddress()
sendMessageToBot()
函数。调用了
subscribe()
onError()
,但我希望链会终止,并且
verifyEmailAddress()
调用
verifyNotEmpty()
后不会调用
onError()
。我不知道你的意思。是否要收集所有错误?如果是这样,请查看mergeDelayError( ) operator@Buckstabue从我问题中的代码片段中,我有3个完整的表链接在一起。
verifyNotEmpty()
verifyEmailAddress()
,和
sendMessageToBot()
。现在的行为是:如果运行
verifyNotEmpty()
的编辑文本为空,则
subscribe()
onError()
被调用,然后Completable链通过调用
verifyEmailAddress()
sendMessageToBot()
继续。我想要:如果运行
verifyNotEmpty()
的EditText为空,则
subscribe()
OneError()
被调用,然后Completable链终止,不调用
verifyEmailAddress()
sendMessageToBot()
。让我猜猜。verifyEmailAddress()方法是绝对正常的被调用,我怀疑您正在可观察对象之外执行一些业务逻辑。您可以将该逻辑放在可观察对象内,它将被延迟计算。这类似于可观察对象之间的差异。just(getMyInteger())和observable.fromCallable(()->getMyInteger())。在第二种情况下,getMyInteger()将在订阅后延迟调用,而第一个将立即调用