Në përgjithësi është një formë e dobët të përdorësh Await
në një Future
. Zakonisht është e panevojshme, por "ndihet" si metoda e saktë nëse nuk jeni të njohur me të ardhmen.
Pasi një rezultat të vijë si një e ardhme, ju mund ta lini llogaritjen "brenda" të së ardhmes dhe të shtoni më shumë funksionalitet mbi vlerën origjinale.
Duke adresuar drejtpërdrejt pyetjen tuaj, ju mund të përdorni operatorët e së ardhmes në vend të Await për të "marrë përmbajtjen e përgjigjes" (shih përgjigjen e Frederic A. se pse duhet të merrni parasysh transmetimet përpara se të shkoni me zgjidhjen e mëposhtme):
import scala.concurrent.duration._
val responseFuture : Future[HttpResponse] = ??? //same as in question
val responseBody : Future[ByteString] =
responseFuture
.map(_.entity)
.flatMap(_.toStrict(10 seconds))
.map(_.data)
Kjo seri operacionesh mund të kryhet gjithashtu duke përdorur për të kuptuar:
val responseBody : Future[ByteString] =
for {
entity <- responseFuture.entity
strict <- entity.toStrict(10 seconds)
body <- strict.data
} yield body
Nëse dëshironi të printoni rezultatin kur të jetë gati, atëherë mund të bëni diçka si:
responseBody foreach { body =>
println s"body: ${body.utf8String}"
}
Edhe një herë, vini re se ne ishim në gjendje të transformonim një HttpResponse
në një ByteString
dhe të printonim rezultatin pa përdorur Await. Në vend të kësaj, ne përdorëm map
, flatMap
dhe foreach
për të përmbushur detyrën.
Një truk mendor që përdora kur përdora për herë të parë Futures ishte të imagjinoja një të ardhme si një lloj të veçantë Array. Ju nuk mund të zgjidhni elementin nga Array, gjë që bën Await, por mund të përdorni hartën dhe flatMap në grupin special kur dëshironi të operoni me elementin.
12.08.2017
toStrict
pranoni vetëm njëFiniteDuration
si parametër, kështu qëDuration.Inf
do të shkaktojë një mospërputhje të tipit. Ndryshojeni në1 seconds
dhe importiimport scala.concurrent.duration._
do ta rregullojë. 13.08.2017