Ich habe eine Frage, die Scoping in Scala betrifft. Ich habe eine Funktion wie folgt aus:Scala Timing Probleme mit dem Hinzufügen von Zeug zu einem Seq
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)
}
Lets "elementsIds" sagen eine Länge von 2. hat die Konsole sagt: firstprint: second: hallo ThirdPrint: hallo hallo ThirdPrint: hallo hallo hallo Warum macht Scala das? Ich würde annehmen, dass der dritte Druck zuerst ausgeführt wird. Als ich zur "FirstPrint" komme, sind die "Hi" s verschwunden. Warum wird die letzte Codezeile zuerst ausgeführt? Ich arbeite mit Slick und Futures, hat das etwas damit zu tun? Vielen Dank!
UPDATE
Danke, funktioniert gut. Ist es möglich, stattdessen einen Seq zurückzugeben? Wie folgt:
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
}
Ist es möglich, "mySequence" zurückzugeben, wenn idsAsElements "onComplete" ist?
Ist 'dto.getElementIds (id)' 'eine Future' Rückkehr? Können Sie die Typen bereitstellen? –
ja Future [Seq [Int]] (ids) – Felix
Es läuft also in einem parallelen Thread im Hintergrund. Während Ihr 'FirstPrint' in Zeile ausgeführt wird, arbeitet der andere Thread immer noch daran, diese IDs von dort zu bekommen, wo er sie bekommt, sobald dies geschieht, wird die' .map' ausgeführt. – Dima