如何处理未来[期权[价值]]scala

如何处理未来[期权[价值]]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

下面是这个代码段运行良好,但具有Await.result

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匹配