0
votes

Comment envoyer une loveable personnalisée à travers la plattamap à Rxjava sur Android?

Donc, j'utilise Flatmap avec Rxjava pour chaîner des appels d'API qui renvoient des singles et se demandaient comment transmettre une mise sur mesure à la méthode d'abonnement dans la méthode de la colonne-colle en fonction de ma propre condition.

Ceci est dans une kotlin Android. application qui utilise mvvm et rxjava2 / rxandroid pour les opérations de données. J'essaie de chaîner ensemble un tas d'appels d'API qui renvoient des singles à l'aide de la méthode FlatMap. Chaque fois que je veux appeler une nouvelle méthode API après la précédente, je veux vérifier si la réponse de l'appel précédent a été réussie. Si la réponse de l'appel précédent a réussi, j'appelle juste la méthode de l'API suivante dans la carte locale et tout est bon, mais si la réponse de l'appel précédent n'a pas été couronnée de succès, je veux passer une lancée personnalisée qui me dit où et pourquoi l'opération a été utilisée. t succès. En ce moment dans la situation d'une réponse infructueuse, je passe un seul avec une valeur nulle, mais cela me donne simplement un pointeur NULL lors de l'abonnement et qui n'est pas très utile. P>

dataManager.apiCall1(dataManager.sessionId!!)
            .subscribeOn(schedulerProvider.io())
            .observeOn(schedulerProvider.ui())
            .flatMap{apiCall1Response ->
                if (apiCall1Response.isSuccessful && apiCall1Response.body() != null) {
                    // First api call was successful, execute api call 2.
                    return@flatMap dataManager.apiCall2(apiCall1Response.importantVal)
                } else {
                    // First api call failed 
                    Single.just(null)
                }
            }.flatMap{apiCall2Response ->
                if (apiCall2Response != null && apiCall2Response.isSuccessful && apiCall2Response.body() != null) {
                    // Second api call was successful, execute api call 3.
                    return@flatMap dataManager.apiCall3(apiCall2Response.importantVal)
                } else {
                    // Second api call failed
                    Single.just(null)
                }
            }.subscribe({apiCall3Response ->
                if (apiCall3Response != null && apiCall3Response.body() != null) {
                   // Success!
                   navigator!!.successful(response)
                } else {
                   // Third api call failed, handle error
                   navigator!!.handleError(Throwable("Api call 3 failed."))
                }
            }, {throwable ->
                // Failure, this is where I want to receive a custom throwable 
                // in case one of the responses were unsuccessful.
                navigator!!.handleError(throwable)
            })


0 commentaires

3 Réponses :


0
votes

Utilisez ce code

Jetez NullPointerException de Flatmap

et attraper l'erreur par .Enterroreturn (lanceur -> {// votre travail ici})

@carson j.


0 commentaires

3
votes

au lieu de single.just (null) Utilisez simple.error () . Par exemple: simple.Error (RunTimeException ("premier appel de l'API a échoué"))


0 commentaires

1
votes

Pour le code le plus lisible, définissez une fonction d'extension comme celle-ci xxx

utilisez-la comme ceci: xxx

etc.


0 commentaires