С упомянутыми выше типами проблем с блокировкой ввода-вывода Scala предлагает встроенное языковое решение, которое идеально подходит: Futures .Например:
def expensiveDBQuery(key : Key) = Future {
//...query the database
}
val dbResult : Future[Result] =
expensiveDBQuery(...) //non-blocking call
dbResult немедленно возвращается из вызова функции.Результат будет доступен в "Future
".Самое интересное в будущем - то, что вы можете думать о них, как о любой старой коллекции, за исключением того, что вы никогда не можете позвонить .size
о будущем.Кроме этого, все функции коллекции (например, map
, filter
, foreach
, ...) являются честной игрой.Просто думайте о dbResult как о списке результатов.Что бы вы сделали с таким списком:
dbResult.map(_.getValues)
.filter(values => someTestOnValues(values))
...
Эта последовательность вызовов устанавливает вычислительный конвейер, который вызывается всякий раз, когда Результат фактически возвращается из базы данных.Вы можете указать последовательность вычислительных шагов до получения данных.Все асинхронно.