スケーラでのスコープに関する質問があります。私はこのような機能を持っている:スケーラのタイミングで問題が発生する場合があります。
def getElements(id: Int): Seq[Element] = {
var test = ""
dto.getElementIds(id).map {
elementIds => {
test += " hello "
elementIds.foreach(elementId => dto.getElement(elementId).map {
case Some(element) => test += " hi "
println("ThirdPrint: " + test)
})
println("SecondPrint: " + test)
}
}
println("FirstPrint: " + test)
}
は "elementsIds" と言うことができます。2. のな長さを有するコンソールは言う: FirstPrint: SecondPrint:こんにちは ThirdPrint:こんにちはこんにちは ThirdPrint:こんにちはこんにちはこんにちは なぜそれはスカラーですか?私は3番目の印刷が最初に実行されると仮定します。私が "FirstPrint"に行くとき、 "hi"はなくなってしまいました。コードの最後の行が最初に実行されるのはなぜですか? 私は滑らかな先物と一緒に働いていますが、これには関係がありますか?ありがとう!
UPDATE
おかげで、正常に動作します。 代わりにseqを返すことはできますか?このように:
def getElements(id: Int): Future[Seq[Element]] = {
var mySequence: Seq[Element] = Seq()
val elementsIds: Future[Seq[Int]] = dto.getElementIds(id)
var test = ""
val elementsF = elementsIds.flatMap {
elementIds => {
test += " hello "
val idsAsElements: Seq[Future[Element]] = elementIds.map(elementId => dto.getElement(elementId).collect {
case Some(element) => mySequence = mySequence :+ element
})
val idsAsElementsF: Future[Seq[Element]] = Future.sequence(idsAsElements)
idsAsElementsF.onComplete(_ => println("SecondPrint: " + test))
idsAsElementsF
}
}
elementsF.onComplete(_ => println("FirstPrint: " + test))
elementsF
}
idsAsElementが "onComplete"のときはいつでも "mySequence"を返すことはできますか?
は 'dto.getElementIds(ID)' 'Future'を返しますか?あなたはそのタイプを提供できますか? –
はい未来[Seq [Int]] – Felix
これは、バックグラウンドで並列スレッドで実行されています。あなたの 'FirstPrint'が行頭で実行されている間に、他のスレッドはそれらのIDを取得する場所からこれらのIDを取得する作業をしています。一度起これば、' .map'が実行されます。 – Dima