繁体   English   中英

使用Scala和Play Framework的嵌套异步调用?

[英]Nested Async calls using Scala and Play Framework?

我想进行嵌套的异步调用。 我想先执行一个异步调用,然后再进行第二次异步调用。 第一个异步调用将规定第二个异步调用要采取的参数或操作。

这是原始的异步调用:

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()方法的返回值,请参见下面的示例代码。 这些cookie需要使用withCookies()方法添加到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()异步方法,但又确保不会产生类型不匹配错误?

将下一个异步调用(Future) 放在内以进行理解。 这样,您可以链接呼叫。 假设Page.load()返回Future[Page] ,在page值下面的代码中将是Page not Future[Page] 这样getAuthCookies方法之后将调用Page.load()

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

还要注意,对于理解来说, flatMap操作只是语法糖。 我对期货的良好介绍可以在这里找到:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM