¿Cómo pasar argumentos a la función del detector de eventos en flex / actionscript?

Ya que al usar sql lite si intentas hacer una función en el mismo momento arroja un error, estoy tratando de hacer una función que verifique si se está ejecutando, y si vuelve a intentarlo en 10 milisegundos, esta función exacta funciona bien si no tengo que pasar ningún argumento a la función, pero estoy confundido sobre cómo puedo pasar los vars a la función que ejecutará.

Quiero hacer:

timer.addEventListener(TimerEvent.TIMER, saveChat(username, chatBoxText)); 

Pero solo me permitirá hacerlo:

 timer.addEventListener(TimerEvent.TIMER, saveChat); 

Me da este error de comstackción:

1067: coacción implícita de un valor de tipo vacío a un tipo no relacionado Función

¿Cómo puedo lograr que esto supere esta limitación?

Esto es lo que tengo:

 public function saveChat(username:String, chatBoxText:String, e:TimerEvent=null):void { var timer:Timer = new Timer(10, 1); timer.addEventListener(TimerEvent.TIMER, saveChat); if(!saveChatSql.executing) { saveChatSql.text = "UPDATE active_chats SET convo = '"+chatBoxText+"' WHERE username = '"+username+"';"; saveChatSql.execute(); } else timer.start(); } 

Una función llamada por un oyente solo puede tener un argumento, que es el evento que lo desencadena.

listener:Function oyente que procesa el evento. Esta función debe aceptar un objeto de evento como su único parámetro y no debe devolver nada, como muestra este ejemplo:

function(evt:Event):void

Fuente

Puede evitar esto haciendo que la función invocada por el evento llame a otra función con los argumentos requeridos:

 timer.addEventListener(TimerEvent.TIMER, _saveChat); function _saveChat(e:TimerEvent):void { saveChat(arg, arg, arg); } function saveChat(arg1:type, arg2:type, arg3:type):void { // Your logic. } 

Otra cosa que puede hacer es crear una clase de evento personalizada que amplíe flash.events.Event y cree las propiedades que necesita dentro.

 package { import flash.events.Event; public class CustomEvent extends Event { // Your custom event 'types'. public static const SAVE_CHAT:String = "saveChat"; // Your custom properties. public var username:String; public var chatBoxText:String; // Constructor. public function CustomEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false):void { super(type, bubbles, cancelable); } } } 

Luego puede enviar esto con las propiedades definidas:

 timer.addEventListener(TimerEvent.TIMER, _saveChat); function _saveChat(e:TimerEvent):void { var evt:CustomEvent = new CustomEvent(CustomEvent.SAVE_CHAT); evt.username = "Marty"; evt.chatBoxText = "Custom events are easy."; dispatchEvent(evt); } 

Y escúchalo:

 addEventListener(CustomEvent.SAVE_CHAT, saveChat); function saveChat(e:CustomEvent):void { trace(e.username + ": " + e.chatBoxText); // Output: Marty: Custom events are easy. } 

En realidad, puede pasar parámetros adicionales a un detector de eventos sin crear un evento personalizado mediante la construcción de funciones dinámicas de Actionscript.

 private function addArguments(method:Function, additionalArguments:Array):Function { return function(event:Event):void {method.apply(null, [event].concat(additionalArguments));} } 

Cuando configuramos closeHandler para la ventana Alert, llamamos al método addArguments () y pasamos una matriz que contiene todos los parámetros que queremos pasar al closeHandler. El método addHandler () devolverá la función a la que llamaremos cuando la ventana Alerta se cierre con los parámetros incluidos.

 protected function btnOK_clickHandler(event:MouseEvent):void { Alert.show("Would you like to reverse the text you just entered?", "", Alert.YES | Alert.NO, null, addArguments(alertCloseHandler, [txtInput.text]), null, Alert.YES); txtInput.text = ""; } 

1067: coacción implícita de un valor de tipo vacío a un tipo no relacionado Función

Preste la debida atención al error que recibió: dice que una Function es un tipo y que addEventListener() quiere. Aunque tu oyente devuelve vacío, ¡es una Function ! Entonces, ¿qué hay de devolver al oyente ?

 timer.addEventListener(TimerEvent.TIMER, saveChat(username, chatBoxText)); function saveChat(username:String, chatBoxText:String):Function { return function(e:TimerEvent):void { // Do everything that uses "e", "chatBoxText" and "username" here! }; } 

Simple como este. Funciona para cualquier tipo de evento. Y no hay problemas de cierre.

Nota sobre removeEventListener() :

No intente hacer timer.removeEventListener(TimerEvent.TIMER, saveChat(username, chatBoxText)) . No reconocerá su función porque le pasará una nueva cada vez que use saveChat() . En cambio, simplemente tome su referencia en una variable y listo:

 var functionSaveChat:Function = saveChat(username, chatBoxText); timer.addEventListener(TimerEvent.TIMER, functionSaveChat); //trace(timer.hasEventListener(TimerEvent.TIMER)); timer.removeEventListener(TimerEvent.TIMER, functionSaveChat); //trace(timer.hasEventListener(TimerEvent.TIMER)); 

Puedes intentar esto:

 var timerHandler:Function = function (event:TimerEvent):void { saveChat(username,chatBoxText,event); } timer.addEventListener(TimerEvent.TIMER, timerHandler); 

Por encima de llamar a saveChat (arg, arg, arg) no es para mí, necesito pasar argumentos que no tengo en este método, pero tengo otra solución

Siempre estoy usando métodos adicionales passParameters para agregar nuevos argumentos:

 public function passParameters(method:Function,additionalArguments:Array):Function {return function(event:Event):void{ method.apply(null, [event].concat(additionalArguments));} } 

la explicación de esto está aquí – es simple y siempre funciona http://sinfinity.pl/blog/2012/03/28/adding-parameters-to-event-listener-in-flex-air-as3/