Actionscript 3 :: Using A Callback (instead Of An Event)?
Aug 30, 2010how to write a callback instead of using an event to communicate between two classes (objects) in Actionscript 3.0?
View 2 Replieshow to write a callback instead of using an event to communicate between two classes (objects) in Actionscript 3.0?
View 2 RepliesThis might be more of a subjective question, but is it generally best practice to have one dedicated method per event-types that you add an event-listener?
Such as:
myButton.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
myButton.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
//Somewhere else in the code...
[Code].....
And if you had a MouseEvent.MOUSE_UP, MouseEvent.MOUSE_DOWN and other relevant MouseEvents event-listeners to watch for, you could even set a switch statement to handle all the various MouseEvent types.
I created an image uploader for an app I am working on. I first used php for the server side script, and everything worked fine. I found out afterwards I had to use .net, so I created new serverside scripts. The problem I am having is that my event.COMPLETE listener is never firing. I can receive data back using a DATAEVENT listener, but then it stops at this error:
Error #2044: Unhandled IOErrorEvent:. text=Error #2036: Load Never Completed.
Here is how I am sending my file.
var fileRefReq:URLRequest = new URLRequest(FILE_UPLOAD_TEMP);
var fileReqVars:URLVariables = new URLVariables();
fileReqVars.subdir = "Temp";
fileRefReq.data = fileReqVars;
fileRefReq.method = URLRequestMethod.POST;
fileRef.upload(fileRefReq);
The file definitely gets uploaded to the first TEMP directory, but then it breaks with the above error.
In our app, I am periodically noticing that a particular event handler is not firing. 99% of the time, it works fine, but, every so often, it just dies. How can I find out whats happening? Is the DispatchEvent() not happening/working somehow? Is my listener still listening? Did something else catch the event, and not pass it along so that the 'right' listener can get to it ?
Here's a little bit of the code...
Thats a somewhat pruned down version of what the real code is, but I don't think I trimmed out anything important. The key, as I see it is that we fire up the params dialog, then start to listen for the closed event. Then, we show the param dialogs close function. What happens when it fails is that the trace message "caught close event.." is never generated, and, consequently, the closeHandler is not getting called at all.
I have been experimenting with supplying better debugging information when an error happens in asynchronous code in AS3.
As an example of the poor error reporting be default, take the case where I force a null pointer in a Timer callback (github gist), I get the following stacktrace back on the console:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Function/<anonymous>()[/[path-to-source-file]/TestClass.as:14]
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()
This tells me very little about how the timer callback actually links to my code.
The question is: How can I get information about what code created the callback?
I rarely use NetStream or any video in my projects, but someone I email with was wondering this, and I have no earthly idea.
Is there any reason why the NetStream's "onMetaData" event cannot be listened to using addEventListener, but instead requires you to use a callback function?
Is it faster, avoiding the overhead of events? Is it to prevent more than one listener being attached?
For example:
for(var i:int=0; i<someArray.length; i++)
{
var loader:Loader=new Loader();
loader.load(new URLRequest("http://testurl.com/test.jpg"));
[Code]....
The second paramter (i) for imageLoaded is always 1, I guess because i no longer exists and is defaulting to 1. Is it possible to get that second paramter to be evaluated when the load is started rather than on complete?
fileReference.addEventListener(Event.COMPLETE, uploadCompleteHandler);
private function uploadCompleteHandler(event:Event):void {}
Above is one way to add an event listener in Actionscript. By default the callback function needs to have an argument with name event and type Event. Is there a way to declare this function without any arguments :
private function uploadCompleteHandler():void {}
Edit : It's possible to add an event handler without any arguments in mxml. So one student wanted to know, why isn't it possible to do the same in actionscript?
I have created a flex project on flash builder 4. In the MXML I have
xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="init();"
And to check if it runs
[Code]...
I've got a really weird problem that I've boiled down to its fundamentals, and I'm hoping that someone here smarter than I am knows why AS3 would be acting this way. Attached is a ZIP with a few FLAs and .AS files. I'm using Flash CS5. Please bear with me as I explain the situation.
I have a class called TestChildA:
package testing
{
import flash.display.MovieClip;
[Code]...
For some reason, the fact that we're not trying to obtain a TestChildA reference allows the Frame 0 ActionScript in TestChildA.swf to execute properly. TestChildB, on the other hand, continues to fail Frame 0 execution since we're still getting a reference to it.
As we saw in the first version of the INIT handler above, querying the test_str variable out of the loaded content directly without trying to cast it worked fine. Why is it that using 'as' to get a specific reference to the content with the proper class results in the Frame 0 script of that content to fail running? Theoretically, the Frame 0 actions should have already been executed prior to reaching the INIT handler anyway, so it's doubly confusing.
If anyone has a better understanding than I of the ActionScript internals and can explain the reason for this issue,
i use the following code to embed a video:
$('#trailer-dialog').mediaelementplayer({
enablePluginDebug: false,
// remove or reorder to change plugin priority
plugins: ['flash','silverlight'],
// specify to force MediaElement to use a particular video or audio type
[Code]...
I am integrating a flash module with Drupal using XMLRPC module. I am currently calling a node.save on Drupal(which creates a page in drupal), using Actionscript 2.0. On a flash button click, I am currently calling the node.save function. But ideally, I would like the function to be called first and only after the success of node.save, forward to the confirmation url. Right now, I am being forwarded to the page even without node.save being completed. I then have to refresh the page in order to see the results.
[Code]...
My as3 code ( build in cs5 osX 10.6 ) doesn't work in flash cs5 osX 10.7!
When I store a callback function in a parent class variable the refrence is weak and no more avaiable for other calls!
exemple:
parent class:
-----------------------------
public class Foo
{
protected var _fct:Function;
}
[Code]....
I am trying to write an IF Else statement that will check to see if a movieclip on the stage has an external SWF loaded in it that was loaded using the loadMovie command. Does the loadMovie command or the internal movieclip object have any kind of a built in function that will return a value if it has an external SWF loaded in it?
View 1 Repliesi made an example so i can explein the prob better.[code]I am making a class and if have another build in object in it. I what to add a callback to it but the inheritance is not right. I know how the set up inheritance
1) subClass.prototype.__proto__ = superClass.prototype;
2) subClass.prototype. = new superClass;
but its all messed up in my head so I was hoping someone could point me in the right direction on how to get the callback to work with out messing up the LoadVars class too much
I have a Javascript API, which should be usable with GWT and Flex. Using the FABridge it is really easy to call Javascript methods from AS3 and vice versa. But when I try to register a callback to an AS3 method in my Javascript API I get stuck. Here is a short code sample:
[Code]...
I am pretty new to flex, so forgive me if this is an obvious question.Is there a way to open the Security.showSettings (flash.system.Security) with a callback? or at least to detect if it is currently open or not? My flex application is used for streaming audio, and is normally controlled by javascript, so I keep it hidden for normal use (via absolute positioning it off the page).
When I need microphone access I need to make the flash settings dialog visible, which works fine, I move it into view and open the dialog. When the user closes it, I need to move it back off the screen so they don't see an empty flex app sitting there after they change their settings.
I am trying to figure out how to define a callback to my model object, via the Mate Frameworks LocalEventMap.
<EventHandlers type="{WebServiceEvent.RT_GET}" debug="true">
<HTTPServiceInvoker url="/services/rtGet.asp">
<resultHandlers>
[Code]....
I get essentially the same error if I try to make method="model.rtGetHandleResult"
So, in keeping with the presentation model... how do I have the event map get this to the model to execute?
Having a strong C++ background, I wonder how this works in Actionscript :
class A {
public function callme():void {[code].....
i.e have separate function and object pointers.
I'm making a callback from javascript to a method on my swf. It works in Firefox with no problems, but in chrome the second parameter that's passed is always received as null? I've debugged my javascript and found that everything is working fine and the two values that are passed to the swf are correct at the point where the callback to the swf is made. At first i thought this might be a cross domain issue, but have ruled that out as if it were the case then the method on swf would just not be called at all. The second value is a binary string representation of an image and the length of the string that is passed is 101601, so i'm wondering whether there's possibly a limitation on the amount of data that can be passed? The first parameter is a much smaller string representing the file type and this always gets received successfully.
[CODE]...
I'm trying to call a function in my ActionScript from my JavaScript, I've managed to successfully do this with another flash file but in the current one it's failing for some reason. I'm using jQuery SWFEmbed, this is my JS code:[code]The ExternalInterface.call work, and the trace outputs true, I have no idea what's going on.If you could also tell me how I can pass parameters to a ExternalInterface callback.
View 1 RepliesFlex:
public function callFromJavaScript():String
{
test.label='dfdsfsdf';
return "1";
}
public function init():void {
[Code]...
I have no clue wich one are crossbrowser compatible (cant install IE to test out)I have tried multiple but i cant get them to work(in any browser), im probably using the wrong id, ive been trial & erroring for a couple of hours but i don't have anything working.(i heard there was a problem with ExternalInterface.addCallback on a local file system?, should i upload the swf? < is the flex code right& problem = javascript/html side?)
There is some way to make a tweet from an AS3 app, passing a message and a url to tweet, and executing a callback if the tweet was succesfully posted?
View 1 Replies What I get is that you can pass a function to another function as an argument so that the function that you pass to can "call back" that particular function.
All good. However, I'm unclear about a couple things: Why exactly is this beneficial? is this the same thing that the addListenerEvent method does when you pass it a function as an argument for when the event fires?
There are several built-in callback functions in Flash, all of them very useful because they are monitoring events and immediately execute actions. They made us economy in code writings. Unfortunately, there's not enough callback functions that fulfill our particular requirements. For example, there's not such a MovieClip.onFrameReached(n) function, that makes something when the movie clip reaches the frame number n. I must appeal to setInterval function to monitor when the movie clip reach the frame n. I try to avoid using that because I believe it is resource consuming. In ActionScript 2.0, can you create your own callback functions or methods? think about what useful a function I described would be when you work with external swf's in order to synchronize it with other objects.
View 3 RepliesI have a Flash movie embeded with swfobject in a html container. Through ExternalInterface I have registered a javascript function to fire callback to my flash app.
ExternalInterface.addCallback("notifyClose", notifyOnClose );
The javascript function is added as an event listerner to fire onbeforeunload.
<script language="JavaScript">
function getSWF(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1){
[Code].....
I have tested in FF and IE. Firefox works as expected but not in IE. In IE I get notified in Flash with the onload message, but not onbeforeunload.
I am currently doing something like this:
myFunc(tracer);
function tracer(message:String):void{
trace(message);[code]........
Now, this works fine. But how can the function myFunc know, if the given callback function accepts the correct number and type of arguments in its signature?I want to avoid that I call something like this somewhere in my code:
myFunc(tracer2);
function tracer2():void{
trace("done");[code]..........
Is there a way to do something like this, in order to use compiler warnings/error messages and thus avoid exceptions at runtime?
// Won't work :-(
function myFunc(callback(message:String):Function):{
callback("Hello");
}
Basically, I have some functions in my as file. Some of them play with a mc instance. The instance is not available when calling the function that uses it as callback.
AS
function B(){
ExternalInterface.call('console.log','ok')//OK!!!
} //italy is a MovieClip on the Main timeline
function A(){ B();
ExternalInterface.call('console.log',italy)//Error!
} ExternalInterface.addCallback('test',A);
JS
$('flash').test();//flash is my html swf object
The error I get trying to reference italy from A (only) whem called from javascript:
Uncaught exception: Error in Actionscript.
Basically, the italy movieclip is available through the AS functions. But it isn't available if I call an AS function from javascript. As you can see though, I see B from A. It's only Italy that I can't see. why?
I'm trying to use a variation of the Flash Badge to install an AIR application. Here's what needs to happen:
User clicks "download" Send a request using URLRequest/URLLoader to my web service to retrieve some information Pass that information into the AIR app using the install/launch arguments
The problem I'm having is getting the airSWF to do anything after URLLoader is done. Since airSWF.installApplication() must be called within the handler of a user-generated event, it doesn't do anything when it's inside the URLLoader Complete event, and the fact that the original event was user generated doesn't seem to pass through the chain of events.
I have been at it for two days now and have not been able to resolve this issue. I am trying to call an AS3 function from JavaScript via ExternalInterface API which is simply not working at all. If I to call a JavaScript function form html loaded swf, it works beautifully.[code]
View 1 Replies