【问题标题】:Nested Async calls using Scala and Play Framework?使用 Scala 和 Play 框架的嵌套异步调用?
【发布时间】:2015-06-01 15:01:24
【问题描述】:

我想进行嵌套的异步调用。我想在进行第二次异步调用之前执行一次异步调用。第一次异步调用将规定第二次异步调用要采取的参数或操作。

这是原始的异步调用:

def render(param1:String) = Action.async { request =>
  implicit val ctx = RequestContext.createFromRequest(request)
  Page.load(param1, request).map {
      case PageType1(title) =>
        Ok(views.html.main("pageType1", title))
      case PageType2(title) =>
        Ok(views.html.main("pageType2", title))
  }
}

我想在 Page.load() 异步调用之前执行的异步异步验证登录用户的信息。如果用户未登录,则会创建未经身份验证的匿名令牌。此信息需要写入一个 cookie 数组,这是 async getAuthCookies() 方法的返回值,请参见下面的示例代码。需要使用 withCookies() 方法将这些 cookie 添加到 Ok() 方法中。 (最终我还可以根据 getAuthCookies() 方法中收集的信息更改代码流,因此如果用户的会话已过期,则会创建用户登录页面。)这可能是关于代码的更多背景信息是必要的,但希望通用代码示例足以让您了解我正在尝试做什么。

getAuthCookies() 方法的异步调用见下文:

  ...
  implicit val ctx = RequestContext.createFromRequest(request)
  for {
      cookies <- Authenticator.getAuthCookies(request) 
  } yield {
     //Placing Page.load() here doesn't work. It produces a type mismatch err
  }
  ...

我尝试将 Page.load() 代码放在 yield 语句中,但它在更通用的 render() 方法中产生了类型不匹配错误。

如何确保在 Authenticator.getAuthCookies() 异步方法之后调用 Page.load() 异步方法,但确保不产生类型不匹配错误?

【问题讨论】:

    标签: scala cookies asynchronous playframework playframework-2.0


    【解决方案1】:

    将下一个异步调用(Future)放入 for理解。这样您就可以链接调用。假设Page.load() 返回Future[Page],在下面的代码中page 的值将是Page 而不是Future[Page]。这样Page.load()getAuthCookies 方法之后被调用

     ...
      implicit val ctx = RequestContext.createFromRequest(request)
      for {
          cookies <- Authenticator.getAuthCookies(request)
          page <- Page.load()
      } yield {
      }
      ...
    

    另外请注意,因为理解只是 flatMap 操作的语法糖。我很好的 Futures 介绍可以在这里找到:

    http://danielwestheide.com/blog/2013/01/09/the-neophytes-guide-to-scala-part-8-welcome-to-the-future.html

    【讨论】:

    • 迈克尔,你的建议解决了我的问题。除了您的建议之外,我在 yield 语句中用“page match{}”替换了对“Page.load.map{}”的调用,一切正常。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    相关资源
    最近更新 更多