如何处理未来[期权[价值]]scala
下面是这个代码段运行良好,但具有Await.result如何处理未来[期权[价值]]scala,scala,promise,playframework,Scala,Promise,Playframework,下面是这个代码段运行良好,但具有Await.result def validate(loginRequest: LoginRequest): Option[AuthResponse] = { val response:Option[User] = Await.result(userDao.getUserByUsernameAndPassword(loginRequest.username,Utilities.encrypt(loginRequest.password)),Duratio
def validate(loginRequest: LoginRequest): Option[AuthResponse] = {
val response:Option[User] = Await.result(userDao.getUserByUsernameAndPassword(loginRequest.username,Utilities.encrypt(loginRequest.password)),Duration.Inf )
response match {
case Some(value) =>populateResponse(value)
case None => None
}
}
我想用未来而不是等待,然后返回响应。下面是一个非阻塞代码段
val response:Future[Option[User]]= userDao.getUserByUsernameAndPassword(loginRequest.username,Utilities.encrypt(loginRequest.password))
如果不阻塞,您如何获得类似的响应
response match {
case Some(value) =>populateResponse(value)
case None => None
}
您只需在
Future
上调用map
即可更改结果,在该调用中,在选项上调用map
即可更改选项的内容:
response.map(_.map(populateResponse))
如果选项是None
,那么第二个map
将不起作用,如果未来的失败了,那么第一个map
将不起作用。因此根据您的精彩回答,我想出了一个解决方案。因为这是一个选项响应
response.map{
res => res match {
case Some(value) =>populateResponse(value)
case None => None
}
futureOption.map(option=>option.map(values=>populateResponse(value))
-正如我常说的,这是你的朋友。请阅读我在回答中解释的,整个匹配
表达式可以替换为。\map(populateResponse)
。整个解决方案是response.map(u.map(populateResponse))
您也可以按如下方式执行:response.map{case Some(value)=>populatedResponse(value)case None=>None}
-可以消除res=>res匹配