2017-04-13 69 views
0

我必须将一个调度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) 
} 

回答

0

您可以用单一flatMap调用脱身,如果你做这样的事情:

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

//可以,斯卡拉上2.12,与Future.UNIT取代Future.successful(())

+0

所以'Future.successful(())。flatMap(x)'不同于'Future(x).flatMap(identity)'? –

+0

是的。 Future.apply(x)合成等价于Future.successful(())。map(_ => x) –

+0

Future(x).flatMap(identity)就像这样:Future.successful(())。map(_ => x).flatMap(identity)。你想要的是Future.successful(())。flatMap(_ => x) –