flex actionscript-3 actionscript asynchronous

Llamada a función asincrónica en Flex



actionscript-3 actionscript (6)

La respuesta más simple es usar la rutina callLater - ver algunos documentos aquí .

callLater( parseFile, [filename] ); ... public function parseFile( filename : String ) : void { // parse the file }

Otro enfoque es usar la llamada setTimeout , definida en el paquete flash.utils . Esta le permite llamar a una rutina después de que ha transcurrido un período de tiempo específico. Usando esta rutina, puede configurar su función parseFile para llamarse a sí misma repetidamente, dándole los intervalos regulares que estaba buscando:

parseFile( filename ); ... public function parseFile( filename : String ) : void { // parse the file // call this function again in 5 seconds setTimeout( parseFile, 5000, filename ); }

¿Es posible invocar una función de forma asíncrona en Flex? Quiero analizar un archivo a intervalos regulares sin bloquear el resto de la aplicación, ¿cuál es el enfoque recomendado para esto?


También hay una función setInterval que llamará a una función a intervalos regulares que podría ser útil.


setTimeout y setInterval están en desuso.

La clase Timer no solo permite un retraso, sino también un repeatCount: cuántas veces lanzará un evento TIMER y comenzará la cuenta atrás nuevamente. Presumiblemente, uno llamaría a myTimer.stop () dentro del evento antes de hacer lo que quisiera, y myTimer.start () cuando haya terminado.

private function newLinesToParse() : void { myTimer = new Timer(30000, 9999); myTimer.addEventListener(Timer.TIMER, myTimerTick); myTimer.start(); } private function myTimerTick(event : Event) : void { myTimer.stop(); // or (event.currentTarget as Timer).stop(); // do a few lines if (anyMoreLines) myTimer.start(); else myTimer = null; }

Aclamaciones


Lo que necesitas es un concepto llamado hilos verdes . Hay una biblioteca de threading verde por ahí, pero no la he usado.

La implementación que hice para un proceso de importación (1 a 5 minutos) realmente rastreó el tiempo que llevaban las ejecuciones y permitió una cantidad configurable de tiempo por ciclo. Esto le permite elegir la cantidad de fotogramas que eliminó (simplemente actualizamos una barra de progreso modal). También lo clasifiqué con una versión que corría a través de un ICollectionView con un IViewCursor y disparaba el evento con cada elemento.

No puedo suministrar el código fuente debido a su conexión con un producto comercial, pero el concepto es bastante simple de implementar.


Actionscript no admite multithreading, que creo que es lo que realmente estás preguntando aquí.

Si bien la funcionalidad no es inherente a actionscript (o Flex), puede configurar un sistema simulado que use eventos y temporizadores.

No estoy muy claro sobre tu pregunta exacta, así que daré dos respuestas:

1) Desea procesar un archivo cada pocos segundos para actuar sobre cualquier cambio.

En este caso, todo lo que necesita hacer es configurar un temporizador para verificar el archivo periódicamente:

var fileTimer:Timer = new Timer(5000); fileTimer.addEventListener(TimerEvent.TIMER, checkFile); ... private function checkFile(event:TimerEvent):void { // read the file and do whatever you need to do. }

2) Desea analizar un archivo muy grande pero no desea que la aplicación se cuelgue mientras lo hace.

Si desea procesar el archivo en segundo plano, manteniendo la aplicación principal en buen estado, entonces probablemente crearía una función que analizaría varias líneas del archivo y luego enviaría un evento y lo devolvería. Escuche el evento e inicie un temporizador que esperaría unos pocos milisegundos antes de volver a llamar a la función para analizar el siguiente conjunto de líneas.

Esto rompería el análisis de un archivo grande con suficiente tiempo de inactividad para que el resto de la aplicación funcione sin problemas. Tendría que jugar con el intervalo del temporizador y el número de líneas para analizar a la vez para lograr un buen equilibrio de capacidad de respuesta y el tiempo necesario para analizar el archivo.

Espero que tenga sentido!