2017-04-13 3 views
0

Ich musste eine Versenden http-Anforderung in eine andere Zukunft wickeln, weil es scheint, dass die anfängliche Netzwerkverbindung blockieren kann (in Netty oder was auch immer dahinter - das ist z Beispiel, wenn der Computer nur mit statischer IP und keinem DNS an einen anderen Computer angeschlossen ist, blockiert das System zehn Sekunden oder länger, bevor die Zukunft tatsächlich erstellt wird. Anstatt alsoRichtiger Weg, um Code zu blockieren, der blockiert, bevor er Zukunft in einer anderen Zukunft freigibt

Http(req.OK(JsonUTF)) 

Ich habe jetzt

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

Ist das richtig? Gibt es einen Nachteil von flatMap(identity) über flatten, die nur in Scala 2.12 ist und einige "interne Executor" verwendet?

Oder sollte ich

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

verwenden?

Antwort

0

Sie können mit einem einzigen flatMap Aufruf weg, wenn Sie so etwas tun:

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

// Sie können, auf Scala 2.12, ersetzen Future.successful (()) mit Future.UNIT

+0

So ist 'Future.successful (()). FlatMap (x)' unterscheidet sich von 'Future (x) .flatMap (identity)'? –

+0

Ja. Future.apply (x) ist synthetisch äquivalent zu Future.successful (()). Map (_ => x) –

+0

Future (x) .flatMap (Identität) ist wie folgt: Future.successful (()). Map (_ => x) .flatMap (Identität). Und was Sie wollen, ist Future.successful (()). FlatMap (_ => x) –

Verwandte Themen