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?
So ist 'Future.successful (()). FlatMap (x)' unterscheidet sich von 'Future (x) .flatMap (identity)'? –
Ja. Future.apply (x) ist synthetisch äquivalent zu Future.successful (()). Map (_ => x) –
Future (x) .flatMap (Identität) ist wie folgt: Future.successful (()). Map (_ => x) .flatMap (Identität). Und was Sie wollen, ist Future.successful (()). FlatMap (_ => x) –