2017-04-13 67 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) –