[英]Deal with futures in a loop
我正在研究一種對數據庫進行查詢並占用一行的方法。 該行有一個列,用於指定父ID(如果有)。 因此,我的方法有一個名為“ iterate”的閉包,如果最后一行具有父級,則該閉包將執行相同的過程,最后該方法返回這些行的序列。 乍一看,這很簡單,但是我必須處理期貨和類似的東西,而且我對異步編程沒有太多的經驗。 所以。 我的問題是:
有沒有辦法在不使用“等待”的情況下正確執行此方法?
/**
* 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並將其轉換為序列來修復它。
我看到的一個問題在這里: parentsSeq +: Seq(parent)
。 這不會改變序列,而是返回一個新序列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.