正确处理404以在Subscribe方法中进行后续API调用

时间:2019-07-02 17:46:55

标签: kotlin rx-android subscribe

我不是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,或者我只是不理解订阅(所有这些都是完全可能的)。

感谢您的帮助。我很困惑。

1 个答案:

答案 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
           })