Jestem nowy w programowaniu asynchronicznym. Przeczytałem ten samouczek: http://danielwestheide.com/blog/2013/01/09/the-neophytes-guide-to-scala-part-8-welcome-to-the-future.html i byłem zaskoczony, jak łatwo mogę włączyć Future do programu. Jednak, gdy korzystałem z Future z Routingiem, typ zwrotu jest nieprawidłowy.Użyj przyszłości w routingu natryskowym
get {
optionalCookie("commToken") {
case Some(commCookie) =>
val response = (MTurkerProgressActor ? Register).mapTo[..].map({...})
val result = Await.result(response, 5 seconds)
setCookie(HttpCookie("commToken", content = result._2.mturker.get.commToken)) {
complete(result._1, result._2.mturker.get)
}
case None => // ...
}
}
ja naprawdę nie chcę użyć Await
(co jest punktem asynchroniczny gdybym tylko zablokować wątek i poczekaj 5 sekund?). Próbowałem użyć for
-rozumienie lub flatMap
i umieścić wewnątrz działań setCookie
i complete
, ale typ zwracany jest nie do zaakceptowania w Spray. For-Comprehension zwraca "Unit", a flatMap
zwraca Przyszłość.
Ponieważ muszę ustawić ten plik cookie, potrzebuję danych w środku. Czy rozwiązanie to jest Await
? A może jest jakaś smatterowa droga?
'' flatmap' map' i są zwykle droga. Wyrażenie 'for' zwraca tylko' Unit', jeśli używasz go bez 'yield'. Gdy użyjesz 'yield', zostanie on przekształcony w wyrażenie używając' flatMap' i 'map'. – jrudolph