正确的方法来包装代码,在另一个未来发布未来之前阻塞

时间:2017-04-13 12:00:19

标签: scala asynchronous future

我不得不将调度http请求包装到另一个Future中,因为看起来初始网络连接可能会阻塞(在Netty或其背后的任何内容 - 例如,当计算机仅连接到具有静态IP的其他计算机时并且没有DNS;实际创建未来之前十秒或更长时间的系统块)。而不是

  Http(req.OK(JsonUTF))

我现在

Future {
  blocking(
    Http(req.OK(JsonUTF))
  )
} .flatMap(identity)

这是对的吗? flatMap(identity)超过flatten是否有任何不利之处,仅在Scala 2.12中使用了一些"内部执行者"?

或者我应该使用

Future {
  val jsonFut = blocking(
    Http(req.OK(JsonUTF))
  )
  Await.result(jsonFut, Duration.Inf)
}

1 个答案:

答案 0 :(得分:0)

如果您执行以下操作,则可以使用单个flatMap调用:

Future.successful(()).flatMap(_ => blocking { Http(req.OK(JsonUTF)) })

//您可以在Scala 2.12上用Future.UNIT替换Future.successful(())