我不是android开发人员,但是我发现自己支持一些android代码。我有一个带有doscribe方法的“ doesExist” API调用。如果API返回错误,我希望调用第二个API,但是在错误回调中,它不会进行调用。发出请求的函数被调用,但是Charles向我展示了从未真正发出过请求。我花了几个小时浏览博客文章和stackoverflow,却没有找到答案。
代码:
fun doesExistThenCreate(id: String) {
remoteCase.doesCaseExist(id)
.flatMap {
if (it) {
//some stuff
} else {
//create on 200 response but empty body
//this was the old way
remoteCase.createCase(id)
}
}
.subscribe({
//success actions
}, {
//doesExist returns 404, so call create.
//this is the new way, and it's not working
remoteCase.createCase(id)
})
当dosCaseExist API调用成功时,将应用flatMap,并且该块中的部分代码也将调用第二个API。当dosExist返回200时,此选项始终有效。
如果不存在“ it”,原始的dosExist API会返回带有空主体的200。当它不存在时,我们要创建它。我们正在更改API,以在“ it”不存在时返回404,并希望创建它。这就是为什么您会看到两个create调用的原因。当此方法正常工作时,flatMap中的一个将消失。
我已经通过几次查尔斯重写来验证,正是404响应本身才导致它进入订阅错误回调。当我调试时,我可以一直追溯到实际进行API调用的地步,但事实并非如此。就像出于某种原因,当第一个调用抛出404时,它实际上跳过了第二个调用。
很显然,我想发生的是,如果dosCaseExist得到404,我希望运行subsribe错误回调中的createCase。我不确定这是否是线程问题,如果我没有正确处理404,或者我只是不理解订阅(所有这些都是完全可能的)。
感谢您的帮助。我很困惑。
答案 0 :(得分:0)
最后弄清楚了问题所在。我不了解在订阅中创建的调用是我从未订阅过的可观察的对象。相反,我将调用从订阅错误回调中移到了onErrorResumeNext上,这样它就可以遍历整个链并最终得到订阅。我不知道这是做我想做的最正确的方法,但是它有效。
remoteCase.doesCaseExist(id)
.flatMap {
if (it) {
//some stuff
} else {
//create on 200 response but empty body
//this was the old way
remoteCase.createCase(id)
}
}
.onErrorResumeNext(
remoteCase.createCase(id)
)
.subscribe({
//success actions
}, {
//error actions
})