2017-05-15 3 views
0

Quelqu'un peut-il m'aider? J'ai ce petit code:RxSwift: comment lancer une erreur sur une chaîne observable

getUserDetailsApi().flatMap(){users in 
    return getScoreApi(users[0]) 
}.subscribe(
    onCompleted: { 
     print("Done") 
    }, 
    onError: { 
     // which of the two APIs get an error? 
    }) 

J'appelle deux API ici, dans le getUserDetailsApi je veux invoquer une erreur quand il n'a pas pu obtenir les détails de l'utilisateur ou quelque chose qui a mal tourné et sauter le getScoreApi. Pareil sur le getScoreApi s'il ne parvient pas à obtenir le score de l'utilisateur, il va lancer une erreur différente.

Y at-il un moyen que je peux jeter lesdites erreurs sur flatMap() ?. Notez que les deux observables doivent être exécutés dans l'ordre de séquence et ces erreurs ont un message différent

+0

Utilisez une instruction if flatMap pour vérifier si vous condition est remplie, sinon vous pouvez lancer une erreur, comme tel: '.flatMap {if condition {return $ 0} else {error}}' jet – AamirR

Répondre

1

Vous devez lancer l'erreur dans getUserDetailsApi() et getScoreApi().

Exemple:

func getUserDetailsApi() -> Observable<[User]> { 
    return Observable.create { observer in 

     // Your api call 
     // ... 
     // Probably you get the users array or an error. 

     if (error) { 
      observer.onError(YourError.UserDetailsError) // <- Your error 
     } else { 
      observer.onNext(users) 
      observer.onCompleted() 
     } 

     return Disposables.create { 
      // your dispose 
     } 
    } 
} 

Et même pour getScoreApi(). Ensuite, si l'un d'eux échoue, le flatMap échouera.

getUserDetailsApi().flatMap(){users in 
    return getScoreApi(users[0]) 
}.subscribe(
    onCompleted: { 
     print("Done") 
    }, 
    onError: { 
     switch error{ 
     case .userDetailsError: 
      // ... 
     case .otherError: 
      // ... 
     } 
    })