Comunidad de diseño web y desarrollo en internet online

Problema: DispatchEvent siempre devuelve true

Citar            
MensajeEscrito el 12 May 2013 12:34 am
Tengo varias clases que se lanzan señales con listeners/eventos y tengo un problema.

Tengo una clase MAIN desde la cual creo una instancia de la clase A, otra de la clase B, y otra para manejar los eventos. La clase A "pide" a la clase "B" ejecutar un método de B pasándole cierta información.
Mi idea es que B ejecute su método (una consulta SQL a una BBDD) y devolviese TRUE/FALSE según la consulta cumpliera una condición). Por tanto devuelve un booleano.

En la clase A hay un

Código :

IF ( dispatchEvent(evento) )  ejecuto_unas cosas  ELSE ejecuto_otras
y esperaba que, según el booleano que devuelve B, el IF fuera por un lado o por el otro.


Pero resulta que dispatchEvent siempre devuelve TRUE. He mirado la documentación de as3 y por lo visto así es, se devuelve TRUE si el dispatchEvent tuvo éxito. Y claro....mi IF no sirve para nada.

Así que de A a B sí que puedo mandar un evento, pero aparentemente no se como devolverle a A si B tuvo o no éxito. Naturalmente puedo mandar otra señal a B desde A, pero entonces el code se me vuelve muuuuy enrevesado. ¿No me queda más remedio que poner más señales?

Por daniel69

78 de clabLevel



 

chrome
Citar            
MensajeEscrito el 12 May 2013 06:48 am
BuenAS:

Yo cambiaría el enfoque, porque así como lo tienes ahora se va a volver muuuuy enrevesado (como dices). Utiliza un patrón MVC-S, que en tu caso, sólo afectaría al servicio (Un servicio es una clase que se encarga de comunicarse con el exterior de la aplicación, en tu caso, una conexión a una base de datos).

Así, crea una clase ServicioBaseDatos, por ejemplo, y aquí coloca todo el código relacionado con pedir datos, recibir datos, gestión de errores, Esta clase debe tener unos métodos públicos para que el resto de clases puedan trabajar con ella, y emitirá eventos con los resultados que obtenga.

Crea en Main una instancia de ServicioBaseDatos y pásales una referencia a tus clases A, B (por ejemplo, como un parámetro en el constructor). Y dentro de cada clase A, B, a dicha instancia de ServicioBaseDatos que has pasado añadele un listener del evento (o eventos) que distribuye.

Es bueno (si estás acostumbrado a trabajar con interfaces) hacer que el servicio implemente una interfaz con los métodos públicos que quieras usar. Esto hace que tus clases A, B, sólo conozcan del servicio aquellos métodos que pueden utilizar, y no, por error, llamen a algún método, o cambien propiedades que no deben.

Finalmente, A o B, indistintamente,pueden pedir datos al servicio y enterarse (a través de los listeners), de los resultados. Por ejemplo, si A hace

servicio.obtenerUsuarios();

el servicio ejecutaría ese método, obtendría los datos y distribuiría un evento. Este evento los está escuchando tanto A, como B, por lo que ambos se enterarían.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 12 May 2013 07:01 am
BuenAS:

Si no quieres complicarte mucho, no sigas leyendo ;)

Para estos casos es para los que utilizar un framework con inyección de dependencias e inversión de control, como Robotlegs o Parsley ayuda mucho. Le dices al framework (generalmente con una clase de configuración) qué clases van a actuar como Servicio / Modelo, y es el framework el que se encarga de inyectar instancias suyas en las clases que les indiques, además de tener los datos siempre actualizados.

No sé si has visto algún código escrito para estos frameworks, suele aparecer delante del nombre de una variable la palabra Inject. Esto hace que el framework inserte en la clase donde lo pongas una instancia de dicha variable:

Código ActionScript :

[Inject]
public var service:IServicioBaseDatos;

[Subscribe][Bindable]
public var resultadoBaseDatos:ResultadoVO;


Con Parsley este código haría que la clase que lo contiene recibiera una instancia del servicio que va a utilizar y en la propiedad 'resultadoBaseDatos' tendría un resultado ACTUALIZADO de la consulta, por ejemplo.

Pero, lo que digo, si no quieres liarte ahora con un nuevo framework, olvida todo esto. Eso sí, te recomendaría que si pillas un hueco, le eches un vistazo a alguno de estor frameworks, porque ayudan muchísimo ;)

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 12 May 2013 10:22 pm
Pues lo he flipado un poco, no tengo tanto nivel :)

Al final lo he resuelto de forma chapucera.
Tengo una clase para las consultas a la BBDD con métodos y variables de clase (para que sean "globales" y el resto de las clases puedan usarlas).
El caso es que he creado una variable de clase llamada ultimaConsulta.
Cada vez que hago un query hago
ultimaConsulta=true;
si tuvo éxito y
ultimaConsulta=false;
si no lo tuvo.

Entonces, en las clases A y B justo después del dispatchEvent hago un

IF(miBBDDManager.ultimaConsulta) hago una cosa; ELSE hago otra cosa;

Es cutre pero funcional

Por daniel69

78 de clabLevel



 

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.