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) })
3 Réponses :
Utilisez ce code P>
Jetez NullPointerException de Flatmap P>
et attraper l'erreur par .Enterroreturn (lanceur -> {// votre travail ici}) p>
@carson j. p>
au lieu de single.just (null) code> Utilisez
simple.error () code>.
Par exemple:
simple.Error
Pour le code le plus lisible, définissez une fonction d'extension comme celle-ci utilisez-la comme ceci: p> etc. p> p>