循环处理期货
Deal with futures in a loop
我正在研究一种查询数据库并获取一行的方法。此行有一列指定父 ID(如果有)。因此,我的方法有一个名为 "iterate" 的闭包,如果最后一行有一个父项并且最后方法 return 是这些行的序列,它会执行相同的过程。乍一看这很简单,但我必须处理期货之类的东西,而且我对异步编程没有太多经验。所以。我的问题是:
有没有办法在不使用 "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。请注意,此方法效果不佳。它 return 是一个空的 Seq,我知道很明显这会 return 那个。但是打印效果很好并打印出正确的结果。问题是我无法想象在所有期货完成之前有一个没有 "disappear" 的变量。
提前致谢。
编辑:好的伙计们。问题很简单。正如 Ixx 所说,parentsSeq 集合是不可变的。我通过使用 ListBuffer 然后将其转换为序列来修复它。
我看到的一个问题是:parentsSeq +: Seq(parent)
。这不会改变序列,而是 returns 一个新序列。
我正在研究一种查询数据库并获取一行的方法。此行有一列指定父 ID(如果有)。因此,我的方法有一个名为 "iterate" 的闭包,如果最后一行有一个父项并且最后方法 return 是这些行的序列,它会执行相同的过程。乍一看这很简单,但我必须处理期货之类的东西,而且我对异步编程没有太多经验。所以。我的问题是:
有没有办法在不使用 "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。请注意,此方法效果不佳。它 return 是一个空的 Seq,我知道很明显这会 return 那个。但是打印效果很好并打印出正确的结果。问题是我无法想象在所有期货完成之前有一个没有 "disappear" 的变量。
提前致谢。
编辑:好的伙计们。问题很简单。正如 Ixx 所说,parentsSeq 集合是不可变的。我通过使用 ListBuffer 然后将其转换为序列来修复它。
我看到的一个问题是:parentsSeq +: Seq(parent)
。这不会改变序列,而是 returns 一个新序列。