Code to make an Observable
from a Future
This commit is contained in:
parent
85e494cab1
commit
fb2dac9b3f
@ -0,0 +1,39 @@
|
|||||||
|
package org.gerweck.scalafx.util
|
||||||
|
|
||||||
|
import scala.concurrent._
|
||||||
|
|
||||||
|
import org.log4s._
|
||||||
|
|
||||||
|
import scalafx.application.Platform.runLater
|
||||||
|
import scalafx.beans.property._
|
||||||
|
|
||||||
|
/** An [[scalafx.beans.value.ObservableValue]] that pulls its value from a future.
|
||||||
|
*
|
||||||
|
* @author Sarah Gerweck <sarah.a180@gmail.com>
|
||||||
|
*/
|
||||||
|
object FutureObservable {
|
||||||
|
private[this] val logger = getLogger
|
||||||
|
|
||||||
|
/** Construct an observable that gives the value of the future on success.
|
||||||
|
*
|
||||||
|
* Until the future completes successfully, the value will be that of
|
||||||
|
* `defaultValue`. If there is an error, the value will persist as
|
||||||
|
* `defaultValue`.
|
||||||
|
*
|
||||||
|
* If you want to change state in case of an error, I recommend you use
|
||||||
|
* [[scala.concurrent.Future.recover]] to choose the values that will be
|
||||||
|
* used in that case. The `defaultValue` is provided because `Future` has
|
||||||
|
* no equivalent mechanism for this mandatory functionality, but recovery
|
||||||
|
* is already a built-in feature.
|
||||||
|
*/
|
||||||
|
def apply[A](defaultValue: A)(future: Future[A])(implicit ec: ExecutionContext): ReadOnlyObjectProperty[A] = {
|
||||||
|
val prop = ObjectProperty[A](defaultValue)
|
||||||
|
future onSuccess { case a =>
|
||||||
|
runLater {
|
||||||
|
logger.trace("Updating property value after Future's success")
|
||||||
|
prop.value = a
|
||||||
|
}
|
||||||
|
}
|
||||||
|
prop
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user