2017-04-13 5 views
0

ディスパッチHTTPリクエストを別のFutureにラップする必要があったのは、初期のネットワーク接続がブロックされる可能性があるからです(Netty、たとえば、コンピュータがスタティックIPとDNSのない他のコンピュータに接続されていて、実際に将来10秒以上前のシステムブロックが作成されている場合)。だからではなく、別の未来に将来的に出現する前にブロックするコードを壊す正しい方法

Http(req.OK(JsonUTF)) 

の私が今持っている

Future { 
    blocking(
    Http(req.OK(JsonUTF)) 
) 
} .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)) })

//あなたは、Scalaの2.12に、Future.UNITでFuture.successfulを(())を置き換えることができます

+0

'Future.Successful(())ですが、' 'Future(x).flatMap(identity)'と違うのはflatMap(x)ですか? –

+0

はい。 Future.apply(x)はFuture.successful(()と合成的に同等です)map(_ => x) –

+0

Future(x).flatMap(identity)は次のようになります:Future.successful(())。map => x).flatMap(identity)。あなたが望むのはFuture.successfulです(())。flatMap(_ => x) –

関連する問題