Un pequeño paseo por ScalaRx: Parte II

Hace quince días estuvimos viendo muy por encima alguna de las funcionalidades que nos ofrecía la librería ScalaRx. Hoy vamos a acabar ese pequeño paseo dando un poco de caña a los Observables y todas las ventajas que nos ofrecen.

Anteriormente en Scalera …

En el post anterior  vimos como funcionaban las variables reactivas. Aprendimos como declararlas, como modificarlas y como crear estructuras Rx que fueran modificadas cuando las variables reactivas experimentaran un cambio.

La idea principal del post indicaba que el objetivo de la librería ScalaRx era interpretar las variables reactivas y su utilización como un flujo que propaga cambios cuando se produce alguna actualización en alguna de las variables reactivas. Podemos verlo como un efecto mariposa.

Ahora vamos a ver como podemos aprovecharnos de dichos cambios con el tipo Observable.

giphy

El tipo Observable

Mediante el tipo Observable podremos realizar determinadas acciones cuando una variable reactiva cambie de valor. Para ello podemos crear observaciones tanto de un Var como de bloques Rx. Existen dos constructores: mediante trigger o mediante foreach. Con el primero de ellos no tendremos una referencia al nuevo valor. Para obtenerlo debemos usar la llamada a .now. Por otro lado, con foreach tendremos una referencia al nuevo valor propagado en el flujo.

Vamos a crear un par de Observables que devuelvan por pantalla el nuevo valor. Para ello utilizaremos las dos versiones del constructor:

import rx._
val reactiveVar = Var("Hello World")
val o1 = reactiveVar.trigger {
  println(reactiveVar.now)
}
val o2 = reactiveVar.foreach { newValue =>
  println(newValue)
}

En este ejemplo, nada más ejecutarlo, mostrará por pantalla dos “Hello World” debido a que los observables actúan también en la inicialización de la variable reactiva. Si queremos saltarnos el primer cambio en la variable reactiva podemos usar triggerLater.

import rx._
val reactiveVar = Var("Hello World")
val o1 = reactiveVar.triggerLater {
  println(reactiveVar.now)
}

Por último, si queremos eliminar un Observable, podemos utilizar la instrucción kill.

import rx._
val reactiveVar = Var("Hello World")
val o1 = reactiveVar.triggerLater {
 println(reactiveVar.now)
}
o1.kill()

De esta manera, no se volverá a reaccionar a los cambios de la variable reactiva.

Conclusiones

Después de estos dos post, podemos comentar que ScalaRx se basa en flujos de datos en los que existen varios elementos. Como bien se comenta en la documentación de ScalaRx, dichos elementos se pueden ver como:

  • Var: inician los flujos y provocan una avalancha con sus cambios
  • Rx: nodos intermedios del flujo que reaccionaran a los cambios
  • Observables: nodos hoja del flujo que reaccionarán a los cambios sin propagar el flujo.

Podemos aprovecharnos de esta abstracción para crear distintos tipos de aplicaciones o herramientas. Por ejemplo, podríamos tener unos parámetros de configuración dinámicos (Var), que sean utilizados en otras variables (Rx) y que, si se producen cambios en ellos, necesitamos realizar una serie de acciones para adaptarnos a la nueva configuración:

import rx._
val host = Var(etcdHost)
val port = Var(etcdPort)
val databaseUri = Rx {host() + ":" + port()}
val obsDatabaseUri = databaseUri.triggerLater {
  connection.resetWith(databaseUri.now())
}

Este puede ser un patrón típico para adaptarnos a parámetros de configuración dinámica provenientes, por ejemplo, de ETCD o Consul.

Este es solo un ejemplo. Obviamente, podemos realizar cosas mucho más complejas con el flujo provocado por cambios en variables reactivas. Pero eso tocará verlo en futuros post. Agur de limón!

Anuncios

2 thoughts on “Un pequeño paseo por ScalaRx: Parte II

  1. he estado jugueteando, es una lástima que en el foreach no haya manera de acceder a un “oldValue”, por ejemplo, algo del tipo

    val a = Var(1)

    a.foreach(oldValue, newValue =>
    println(s”a ha variado su valor en ${newValue – oldValue}”)
    }

    a() = 12 //a ha variado su valor en 11
    a() = 5 //a ha variado su valor en -7

    etc

    por si a alguien le ayuda, he creado un gist con el código listo para ejecutarse y verse:

    Le gusta a 1 persona

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s