我正在寻找一种方法将以下内容变为非阻止通话:
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)
}
}
我面临的问题是for / yield将Future [String]返回给else语句的名称元组,但返回if语句的Option [String]。我需要他们两个都返回一个选项。换句话说,我需要解决未来。如果我将名称从收益率中拉出来,那么它就不会在相同的范围内,并且编译器无法弄清楚for中是否有一个名称。
如果没有for / yield就可以做到这一点。只是不希望它成为阻止电话。
答案 0 :(得分:1)
你能做的最好的事情是
val (greeting, name): (String, Future[Option[String]]) = if (someCondition) {
("Welcome", Future.successful(Some("")))
} else {
("Hi", userClient.getName(arg))
}
您无法在不等待Future[Option[String]]
的情况下将Option[Future[String]]
转换为Future
;如果Option[Future[String]]
Some
None
Future[Option[String]]
,则for
会事先知道。
在这种情况下,不需要getUsers("channel")
理解。