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.

Problema de incompatibilidad de tipos en Scala Future.

Me estoy encontrando con un problema en Scala y múltiples futuros en un escenario de “for yield”. Tanto f1 como f2 son futuros. El futuro f2 se basa en un valor obtenido del futuro f1.

val result = for {
    f1 <- Await.result(dao.findNode("nodeA"), 5 seconds)           // Esto devuelve una clase MyNode
    f2 <- if (f1 != None && f1.isUpAndRunning)
                Future { LookupResult(true, f1.varA, f1.varB) }
          else
                lk ? Lookup(sm.id, sm.("address"))
} yield(f1, f2)

Dependiendo del resultado de f1, hago una Lookup() cuando mi declaración if se evalúa como false (lo cual lleva algo de tiempo y devuelve un LookupResult) o imito un LookupResult predeterminado.

Recibo el siguiente error:

Coincidencia de tipos. Se requiere: Option[B_], encontrado: Future[(MyNode, Any)]

¿Simplemente no estoy mapeando correctamente el resultado? Por ejemplo, ¿debería usar asInstanceOf en alguna parte, ya que no puedo hacer que esto compile de ninguna manera?

Muchas gracias, chicos.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema que estás enfrentando se debe al hecho de que la declaración yield devuelve un Future de tipo (MyNode, Any), pero estás esperando un Option[B_].

    Es posible que el futuro dao.findNode("nodeA") esté devolviendo un valor Option, y es de ahí que proviene el tipo Option[B_]. Sin embargo, dado que estás usando .isUpAndRunning en la declaración if, es posible que f1 realmente sea una clase de MyNode y no un Option.

    Para resolver el problema, es posible que desees verificar los tipos de f1 y f2 antes de realizar cualquier operación sobre ellos. Además, asegúrate de que los tipos coincidan con lo que estás esperando.

    Una solución podría ser cambiar el tipo de retorno del futuro dao.findNode("nodeA") a Future[Option[MyNode]] y ajustar el código en consecuencia. Por ejemplo:

    val result = for {
      f1Option <- dao.findNode("nodeA")
      f2 <- f1Option match {
        case Some(f1) if f1.isUpAndRunning =>
          Future { LookupResult(true, f1.varA, f1.varB) }
    
        case _ => lk ? Lookup(sm.id, sm("address"))
      }
    } yield (f1Option, f2)
    

    Este código verifica la presencia del objeto MyNode antes de verificar sus propiedades. Devuelve un futuro de tipo (Option[MyNode], Any) que coincide con el tipo esperado.

Comments are closed.