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.

Cómo iniciar sesión en Mono vacío

Digamos que tengo las siguientes líneas:

repositorio.findUser(name = "John Doe")
    .map {
        // Se encontró al usuario, continuar procesando
    }
    .switchIfEmpty(
        // Solo registrar que no se encontró al usuario
    )

Mi enfoque actual, que no es el mejor pero funciona, es simplemente colocar el registro en otra función y llamarla, como switchIfEmpty(userNotFound()).

private fun userNotFound(): Mono<out disposable=""> {
    logger.info { "No se encontró al usuario." }
    return Mono.empty()
}

Esto funciona, pero no puedo imaginar que esto sea lo que debería estar haciendo. ¿Cómo puedo mejorar?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hay algunas formas de mejorar el código anterior:

    1. Utilice doOnNext en lugar de map para realizar acciones adicionales en el valor emitido antes de pasarlo aguas abajo.
    repository.findUser(name = "John Doe")
        .doOnNext { user ->
            // Se encontró al usuario, continuar procesando
        }
        .switchIfEmpty(
            Mono.defer {
                logger.info("No se encontró al usuario.")
                Mono.empty()
            }
        )
    

    En este caso, se utiliza doOnNext para realizar un procesamiento adicional en el usuario encontrado antes de pasarlo aguas abajo. Si no se encuentra al usuario, se posterga la llamada al registro hasta la suscripción al Mono, lo que evita el registro innecesario si el Mono nunca se suscribe.

    1. Utilice switchIfEmpty con un Mono vacío para activar una operación de respaldo.
    repository.findUser(name = "John Doe")
        .flatMap { user ->
            // Se encontró al usuario, continuar procesando
        }
        .switchIfEmpty(
            Mono.defer {
                logger.info("No se encontró al usuario.")
                fallbackOperation()
            }
        )
    

    En este caso, se utiliza flatMap para activar el procesamiento solo si se encuentra al usuario. Si no se encuentra, se utiliza switchIfEmpty para activar una operación de respaldo que registra el error y realiza alguna otra operación (por ejemplo, devuelve un mensaje de error). Mono.defer garantiza que fallbackOperation no se ejecute si el Mono no se suscribe.

    Tenga en cuenta que aquí se utiliza flatMap en lugar de map, ya que necesitamos transformar al usuario encontrado en un Publisher (por ejemplo, otro Mono) para continuar con el procesamiento aguas abajo.

    1. Utilice switchIfEmpty con un Mono de respaldo que realice registro.
    repository.findUser(name = "John Doe")
        .flatMap { user ->
            // Se encontró al usuario, continuar procesando
        }
        .switchIfEmpty(
            Mono.fromRunnable {
                logger.info("No se encontró al usuario.")
            }
            .then(Mono.empty())
        )
    

    En este caso, se utiliza flatMap para activar el procesamiento solo si se encuentra al usuario. Si no se encuentra, se utiliza switchIfEmpty con un Mono de respaldo creado utilizando Mono.fromRunnable, que registra el error y devuelve un Mono vacío. El operador then se utiliza para encadenar Mono.empty al final del Mono de registro para asegurar que devuelva un Mono vacío aguas arriba.

    En general, el enfoque elegido dependerá de los requisitos específicos del código y de lo que funcione mejor en el contexto de la aplicación más amplia.

Comments are closed.