吞下错误后,上游永远不会完成
作者:互联网
我正在使用RxJava遍历文件列表,进行网络调用以上传每个文件,然后将成功上传的文件收集到列表中,并将这些文件成功保存在订户中.
此代码有效,但发生错误时除外.行为应该是它记录错误并继续执行,除非发生错误,否则永远不会调用订阅者的onSuccess lambda.
观察者是否期望发出与原始可迭代元素相同数量的元素?迭代完所有项目后,如何跳过错误并完成错误?除了Single.never()之外,还有其他东西可以完成不将错误转发到下游吗?
queryFiles()?.let { files ->
Observable.fromIterable(files)
.flatMapSingle { file ->
uploadFile(file)
.onErrorResumeNext { error ->
log(error)
Single.never() // if this is returned onSuccess is never called
}
.map { response ->
file.id = response.id
file
}
}
.toList()
.subscribe( { uploadedFiles ->
persist(uploadedFiles) // if error occurs above, this is never called
}, { error ->
log(error)
})
}
解决方法:
您的问题是Single只能产生两个值,一个成功的结果或一个失败的结果.通过先将故障转换为Maybe,然后使用基本上相同的代码来处理故障和成功,可以将故障转变为“忽略”状态.
返回值为Maybe.empty()的Maybe.onErrorResumeNext将导致0或1个结果,而Maybe.map仅在具有值的情况下执行,如您所描述的那样准确地解决了问题.
改编代码:
.flatMapMaybe { file ->
uploadFile(file).toMaybe()
.onErrorResumeNext { error: Throwable ->
log(error)
Maybe.empty()
}
.map { response ->
file.id = response.id
file
}
}
标签:rx-java2,android,rx-java,kotlin 来源: https://codeday.me/bug/20191009/1882292.html