首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在喷雾布线中使用Future

在喷雾布线中使用Future
EN

Stack Overflow用户
提问于 2014-07-14 03:18:23
回答 2查看 3.6K关注 0票数 5

我是异步编程的新手。我读了这篇教程http://danielwestheide.com/blog/2013/01/09/the-neophytes-guide-to-scala-part-8-welcome-to-the-future.html,惊讶于我可以如此毫不费力地将Future整合到程序中。然而,当我在路由中使用Future时,返回类型是错误的。

代码语言:javascript
运行
复制
get {
  optionalCookie("commToken") {
    case Some(commCookie) =>
      val response = (MTurkerProgressActor ? Register).mapTo[..].map({...})
      val result = Await.result(response, 5 seconds)

      setCookie(HttpCookie("commToken", content = result._2.mturker.get.commToken)) {
        complete(result._1, result._2.mturker.get)
      }

    case None => // ...
  }
}

我真的不想使用Await (如果我只是阻塞线程并等待5秒,那么异步有什么意义呢?)我尝试使用for-comprehension或flatMap,并将setCookiecomplete操作放在其中,但返回类型是不可接受的。For-comprehension返回“单位”,flatMap返回未来。

因为我需要设置这个cookie,所以我需要里面的数据。Await是解决方案吗?或者有没有什么办法?

EN

Stack Overflow用户

发布于 2014-07-14 20:52:32

您可以使用onSuccess指令:

代码语言:javascript
运行
复制
get {
    optionalCookie("commToken") { cookie =>
      //....
      val response = (MTurkerProgressActor ? Register).mapTo[..].map({...})
      onSuccess(response) {
        case (result, mTurkerResponse) =>
          setCookie(HttpCookie("commToken", content = mTurkerResponse.mturker.get.commToken)) {
            complete(result, mturkerResponse.mturker.get)
          }
      }
    }

还有onFailureonComplete (对于它们,您必须在SuccessFailure上匹配),请参阅http://spray.io/documentation/1.2.1/spray-routing/future-directives/onComplete/

而且,与直接使用get相比,使用map (我假设mturker是一个Option或类似的东西)要方便得多:

代码语言:javascript
运行
复制
case (result, mTurkerResponse) =>
  mTurkerResponse.mturker.map { mt =>
    setCookie(HttpCookie("commToken", content = mt.commToken)) {
      complete(result, mt)
    }
  }
票数 15
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24726330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档