将Await.result转换为for / yield

时间:2017-11-30 18:50:28

标签: scala

我正在寻找一种方法将以下内容变为非阻止通话:

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就可以做到这一点。只是不希望它成为阻止电话。

1 个答案:

答案 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")理解。