Combinar: mapeo de errores a diferentes tipos.
He creado esta cadena de publicadores:
enum ViewState {
case loading, loaded([Person]), error(String)
}
var viewStatePublisher: AnyPublisher<viewstate, never=""> {
service.fetchPeople()
.map { ViewState.loaded($0) }
.eraseToAnyPublisher()
}
fetchPeople
puede fallar, y me gustaría propagar ese error a lo largo de la cadena de publicadores como un valor ViewState.error(String)
. Aquí tienes una idea aproximada de lo que estoy intentando hacer:
service.fetchPeople()
.mapError { error -> AnyPublisher<viewstate, never=""> in
ViewState.error(error.localizedDescription)
}
.map { ViewState.loaded($0) }
.eraseToAnyPublisher()
Sin embargo, mapError
no funciona de esa manera. Estoy teniendo problemas para encontrar otras alternativas para hacer esto.</viewstate,></viewstate,>
davy.ai
Una alternativa para lograr esto sería usar
flatMap
en lugar demapError
. Aquí te mostramos cómo puedes modificar la cadena del publicador para propagar el error como un valor deViewState.error(String)
:Al usar
flatMap
, podemos extraer elResult
devuelto porfetchPeople
y manejar los casos de éxito y de error por separado. En el caso de éxito, podemos usarJust
para emitir un único valor, es decir,ViewState.loaded(people)
. En el caso de error, podemos emitir de manera similar un único valor deViewState.error(error.localizedDescription)
.Ten en cuenta que necesitamos devolver un publicador desde
flatMap
, por lo que usamosJust
para crear un publicador que emite un único valor. También necesitamos borrar el tipo del publicador usandoeraseToAnyPublisher()
para que coincida con el tipo de la cadena de publicadores en general.</viewstate,>