In Scala, posso usare Await
per attendere il completamento di un futuro. Tuttavia, se ho registrato un callback per l'esecuzione al termine di tale futuro, come posso aspettare non solo il completamento del futuro ma anche il completamento di tale callback?Come posso attendere il completamento della callback onSuccess di Scala future?
Ecco un programma minimo, ma completo per illustrare il problema:
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
import scala.concurrent.{ Await, Future }
object Main {
def main(args: Array[String]): Unit = {
val f: Future[Int] = Future(0)
f.onSuccess { case _ =>
Thread.sleep(10000)
println("The program waited patiently for this callback to finish.")
}
// This waits for `f` to complete but doesn't wait for the callback
// to finish running.
Await.ready(f, Duration.Inf)
}
}
mi aspetto l'uscita di essere:
The program waited patiently for this callback to finish.
Invece, non c'è uscita; il programma esce prima che la richiamata termini.
Si prega di notare che questo non è lo stesso problema di un completamento in attesa, a cui è stata data risposta in precedenza allo this question.
Non v'è alcun punto nel fare 2 dei futures, se si sta gettando via il valore del primo. Potrebbe anche funzionare tutto in un unico futuro. –
Questo doveva rimanere il più vicino possibile al codice dato. In un'applicazione reale, il primo futuro produrrebbe un valore effettivamente utilizzato. –
Se 'map' e' flatMap' ottengono le stesse funzioni di 'onSuccess' (e anche di più, dato che possono restituire valori), perché il' onSuccess' nell'API? È solo per simmetria con 'onFailure'? Oppure i costrutti di livello inferiore 'onSuccess' e' onFailure' su cui 'map' e' flatMap' sono implementati sotto il cofano? –