吞下错误后,上游永远不会完成

吞下错误后,上游永远不会完成,第1张

概述我正在使用RxJava遍历文件列表,进行网络调用以上传每个文件,然后将成功上传的文件收集到列表中,并将这些文件成功保存在订户中.此代码有效,但发生错误时除外.行为应该是它记录错误并继续执行,除非发生错误,否则永远不会调用订阅者的onSuccesslambda.观察者是否期望发出与原始可

我正在使用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                    }        }
总结

以上是内存溢出为你收集整理的吞下错误后,上游永远不会完成全部内容,希望文章能够帮你解决吞下错误后,上游永远不会完成所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1095460.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存