加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala用于与Future一起使用的良品率.如何等到未来回归?

发布时间:2020-12-16 19:20:44 所属栏目:安全 来源:网络整理
导读:我有一个提供Context的函数: def buildContext(s:String)(request:RequestHeader):Future[Granite.Context] = { .... // returns a Future[Granite.Context]} 然后我有另一个函数,它使用Context来返回一个Option [Library.Document]: def getDocument(tag:
我有一个提供Context的函数:

def buildContext(s:String)(request:RequestHeader):Future[Granite.Context] = {
    .... // returns a Future[Granite.Context]
}

然后我有另一个函数,它使用Context来返回一个Option [Library.Document]:

def getDocument(tag: String):Option[Library.Document] = {
   val fakeRequest = play.api.test.FakeRequest().withHeaders(CONTENT_TYPE -> "application/json")

   val context = buildContext(tag)(fakeRequest)

   val maybeDoc = context.getDocument //getDocument is defined on Granite.Context to return an Option[Library.Document]

}

如果Future已经返回,这段代码将如何考虑?我已经看到/ yield曾经等待返回,但我总是认为for / yield只是将事情平面化并且与等待Futures返回没有任何关系.我有点被困在这里,并不是真的没有正确的问题要问!

解决方法

另外两个答案是误导性的. Scala中的yield是一个编译器原语,它被转换为map或flatMap链.如果可以避免,请不要使用Await,这不是一个简单的问题.

你正在引入阻止行为,你还没有意识到阻塞时你正在做的系统性伤害.

谈到Future,map和flatMap做了不同的事情:

地图
在未来完成时执行.这是一种进行类型安全映射的异步方法.

val f: Future[A] = someFutureProducer
def convertAToB(a: A): B = {..}
f map { a => convertAToB(a) }

flatMap

是你用来链接的东西:

someFuture flatMap {
  _ => {
    someOtherFuture
  }
}

相当于上述内容:

for {
  result1 <- someFuture
  result2 <- someOtherFuture
} yield result2

在Play中你可以使用Async来处理上述事情:

Async {
    someFuture.map(i => Ok("Got result: " + i))
}

更新

我误解了你对Play的使用.不过,它并没有改变任何东西.您仍然可以使您的逻辑异步.

someFuture onComplete {
  case Success(result) => // doSomething
  case Failure(err) => // log the error etc
}

异步思考的主要区别在于你总是需要map和flatMap并在Futures中做其他事情来完成任务.性能提升很大.

您的应用越大,收益越大.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读