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.
davy.ai
Parece que el problema que estás enfrentando se debe al hecho de que la declaración
yield
devuelve unFuture
de tipo(MyNode, Any)
, pero estás esperando unOption[B_]
.Es posible que el futuro
dao.findNode("nodeA")
esté devolviendo un valorOption
, y es de ahí que proviene el tipoOption[B_]
. Sin embargo, dado que estás usando.isUpAndRunning
en la declaraciónif
, es posible quef1
realmente sea una clase deMyNode
y no unOption
.Para resolver el problema, es posible que desees verificar los tipos de
f1
yf2
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")
aFuture[Option[MyNode]]
y ajustar el código en consecuencia. Por ejemplo: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.