Сделка с фьючерсами в петле
Я работаю над методом, который делает запрос к базе данных и занимает одну строку. В этой строке есть столбец, в котором указан родительский идентификатор, если таковой имеется. Итак, у моего метода есть замыкание с именем "iterate", которое выполняет тот же процесс, если последняя строка имеет родителя и, наконец, метод возвращает последовательность этих строк. На первый взгляд, это просто, но мне приходится иметь дело с фьючерсами и тому подобным, и у меня нет большого опыта в асинхронном программировании. Так. Мой вопрос:
Есть ли способ сделать этот метод правильно без использования "Await"?
/**
* Returns all the parents of the given sector if any
* @param childSector
* @return
*/
def getParents(childSector: ShopSector): Future[Option[Seq[ShopSector]]] = {
val p = Promise[Option[Seq[ShopSector]]]
val f: Future[Option[Seq[ShopSector]]] = p.future
val parentsSeq: Seq[ShopSector] = Seq()
f.onComplete( thing => println(s"Result from Iteration future: $thing") )
def iterate(sector: ShopSector): Unit = {
val query = for {
c <- ShopSectors if c.id === sector.id
p <- c.parent
} yield p
exists(sector.parent_id).map { exists =>
if (exists) {
db.run(query.result.head).map { parent =>
println(s"Result parent: $parent")
parentsSeq +: Seq(parent)
iterate(parent)
}
} else {
p success Option(parentsSeq)
}
}
}
iterate(childSector)
f
}
Кстати, я использую Slick. И обратите внимание, что этот метод не работает хорошо. Он возвращает пустой Seq, и я знаю, что это будет возвращение. Но печать работает отлично, и печать правильных результатов. Дело в том, что я не могу представить себе способ иметь переменную, которая не "исчезнет" до того, как все фьючерсы будут завершены.
Заранее спасибо.
РЕДАКТИРОВАТЬ: Хорошо, ребята. Проблема была так проста. Как сказал Ixx, коллекция parentSeq не является изменчивой. Я исправил это, используя ListBuffer, а затем преобразовав его в последовательность.
1 ответ
Здесь я вижу одну проблему: parentsSeq +: Seq(parent)
, Это не изменяет последовательность, а возвращает новую последовательность.