Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pass arguments into event listener function in flex/actionscript?

Tags:

Since when using sql lite if you try and do a function at the same moment it throws an error, im just trying to make a function that will check if its executing, and if it is try again in 10 milliseconds, this exact function works fine if i dont have to pass any arguments to the function but im confused how I can pass the vars back into the function it'll be executing.

I want to do:

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

But it will only allow me to do:

timer.addEventListener(TimerEvent.TIMER, saveChat); 

It gives me this compile error:

1067: Implicit coercion of a value of type void to an unrelated type Function

How can I get this to pass this limitation?

Here's what I've got:

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(); } 
like image 480
brybam Avatar asked Jun 20 '11 04:06

brybam


1 Answers

A function called by a listener can only have one argument, which is the event triggering it.

listener:Function — The listener function that processes the event. This function must accept an Event object as its only parameter and must return nothing, as this example shows:

function(evt:Event):void

Source

You can get around this by having the function called by the event call another function with the required arguments:

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. } 

Another thing you can do create a custom event class that extends flash.events.Event and create properties that you need within.

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);         }     } } 

Then you can dispatch this with properties defined:

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); } 

And listen for it:

addEventListener(CustomEvent.SAVE_CHAT, saveChat); function saveChat(e:CustomEvent):void {     trace(e.username + ": " + e.chatBoxText);     // Output: Marty: Custom events are easy. } 
like image 152
Marty Avatar answered Oct 14 '22 12:10

Marty