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?
davy.ai
Hay algunas formas de mejorar el código anterior:
doOnNext
en lugar demap
para realizar acciones adicionales en el valor emitido antes de pasarlo aguas abajo.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 alMono
, lo que evita el registro innecesario si elMono
nunca se suscribe.switchIfEmpty
con unMono
vacío para activar una operación de respaldo.En este caso, se utiliza
flatMap
para activar el procesamiento solo si se encuentra al usuario. Si no se encuentra, se utilizaswitchIfEmpty
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 quefallbackOperation
no se ejecute si elMono
no se suscribe.Tenga en cuenta que aquí se utiliza
flatMap
en lugar demap
, ya que necesitamos transformar al usuario encontrado en unPublisher
(por ejemplo, otroMono
) para continuar con el procesamiento aguas abajo.switchIfEmpty
con unMono
de respaldo que realice registro.En este caso, se utiliza
flatMap
para activar el procesamiento solo si se encuentra al usuario. Si no se encuentra, se utilizaswitchIfEmpty
con unMono
de respaldo creado utilizandoMono.fromRunnable
, que registra el error y devuelve unMono
vacío. El operadorthen
se utiliza para encadenarMono.empty
al final delMono
de registro para asegurar que devuelva unMono
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.