es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una alternativa para lograr esto sería usar flatMap en lugar de mapError. Aquí te mostramos cómo puedes modificar la cadena del publicador para propagar el error como un valor de ViewState.error(String):

    service.fetchPeople()
      .flatMap { (result: Result<[Person], Error>) -> AnyPublisher<viewstate, never=""> in
        switch result {
        case .success(let people):
          return Just(ViewState.loaded(people))
            .eraseToAnyPublisher()
        case .failure(let error):
          return Just(ViewState.error(error.localizedDescription))
            .eraseToAnyPublisher()
        }
      }
      .eraseToAnyPublisher()
    

    Al usar flatMap, podemos extraer el Result devuelto por fetchPeople y manejar los casos de éxito y de error por separado. En el caso de éxito, podemos usar Just para emitir un único valor, es decir, ViewState.loaded(people). En el caso de error, podemos emitir de manera similar un único valor de ViewState.error(error.localizedDescription).

    Ten en cuenta que necesitamos devolver un publicador desde flatMap, por lo que usamos Just para crear un publicador que emite un único valor. También necesitamos borrar el tipo del publicador usando eraseToAnyPublisher() para que coincida con el tipo de la cadena de publicadores en general.</viewstate,>

Comments are closed.