我有两个返回期货的功能.我试图使用for-yield理解将第一个函数的修改结果输入到另一个函数中.
这种方法有效:
val schoolFuture = for {
ud <- userStore.getUserDetails(user.userId)
sid = ud.right.toOption.flatMap(_.schoolId)
s <- schoolStore.getSchool(sid.get) if sid.isDefined
} yield s
Run Code Online (Sandbox Code Playgroud)
但是我对那里的"if"感到不满意,似乎我应该可以使用地图了.
但是当我尝试使用地图时:
val schoolFuture: Future[Option[School]] = for {
ud <- userStore.getUserDetails(user.userId)
sid = ud.right.toOption.flatMap(_.schoolId)
s <- sid.map(schoolStore.getSchool(_))
} yield s
Run Code Online (Sandbox Code Playgroud)
我收到编译错误:
[error] found : Option[scala.concurrent.Future[Option[School]]]
[error] required: scala.concurrent.Future[Option[School]]
[error] s <- sid.map(schoolStore.getSchool(_))
Run Code Online (Sandbox Code Playgroud)
我玩了几个变种,但没有找到任何有吸引力的工作.任何人都可以提出更好的理解和/或解释我的第二个例子有什么问题吗?
这是Scala 2.10的一个最小但完整的可运行示例:
import concurrent.{Future, Promise}
case class User(userId: Int)
case class UserDetails(userId: Int, schoolId: Option[Int])
case class School(schoolId: Int, name: String)
trait Error
class UserStore { …Run Code Online (Sandbox Code Playgroud)