Scala 将wait.result转换为for/yield

Scala 将wait.result转换为for/yield,scala,Scala,我正在寻找一种方法,将以下内容转换为非阻塞呼叫: val (greeting, name) = if (someCondition) { ("Welcome", Option("")) } else { var name = Await.result(userClient.getName(arg), Duration.Inf)) ("Hi", name) } 我正在考虑按照以下思路做一些事情: val (greet

我正在寻找一种方法,将以下内容转换为非阻塞呼叫:

val (greeting, name) = 
    if (someCondition) { 
        ("Welcome", Option(""))
    } else { 
        var name = Await.result(userClient.getName(arg), Duration.Inf)) 
        ("Hi", name)
    }
我正在考虑按照以下思路做一些事情:

val (greeting, name) = 
    if (someCondition) { 
        ("Welcome", Option(""))
    } else { 
        for {
            name <- userClient.getName(arg)
        }
        yield {
            ("Hi", name) 
        }   
    }
val(问候语,姓名)=
如果(某些条件){
(“欢迎”,选项(“”)
}否则{
为了{

name你能做的就是

val (greeting, name): (String, Future[Option[String]]) = if (someCondition) { 
  ("Welcome", Future.successful(Some("")))
} else {
  ("Hi", userClient.getName(arg))
}
如果不等待
Future
Option[String]]
的话,就不能将
Future[Option[String]]
转换为
Option[Future[String]
;而
Future[Option[String]
则事先知道它是
一些
还是


在这种情况下,没有必要用
来理解

你的第一个例子是如何不阻塞的?等待不算阻塞吗?为了不阻塞,你必须返回
未来的
@Alec,我认为这个问题的措辞有点误导性。OP表示第一个调用是阻塞的,他们试图让我t non blocking.@jrook当然可以,但我的评论的第二部分确实是关键:如果他们希望它是非阻塞的,它必须返回一个
Future
。@Alec jrook是正确的。我对措辞做了一点更改。希望这能消除混淆