14

Is there any way to implement waiting for, say, 3 seconds in ActionScript, but to stay within same function? I have looked setInterval, setTimeOut and similar functions, but what I really need is this:

public function foo(param1, param2, param3) {
  //do something here
  //wait for 3 seconds
  //3 seconds have passed, now do something more
}

In case you wonder why I need this - it is a legal requirement, and no, I can't change it.

6 Answers6

27

Use the Timer to call a function after 3 seconds.

var timer:Timer = new Timer(3000);
timer.addEventListener(TimerEvent.TIMER, callback); // will call callback()
timer.start();

To do this properly, you should create the timer as an instance variable so you can remove the listener and the timer instance when the function is called, to avoid leaks.

class Test {
    private var timer:Timer = new Timer(3000);

    public function foo(param1:int, param2:int, param3:int):void {
        // do something here
        timer.addEventListener(TimerEvent.TIMER, fooPartTwo);
        timer.start();
    }

    private function fooPartTwo(event:TimerEvent):void {
        timer.removeEventListener(TimerEvent.TIMER, fooPartTwo);
        timer = null;
        // 3 seconds have passed, now do something more
    }
}

You could also use another function inside your foo function and retain scope, so you don't need to pass variables around.

function foo(param1:int, param2:int, param3:int):void {
    var x:int = 2; // you can use variables as you would normally

    // do something here

    var timer:Timer = new Timer(3000);
    var afterWaiting:Function = function(event:TimerEvent):void {
       timer.removeEventListener(TimerEvent.TIMER, afterWaiting);
       timer = null;

       // 3 seconds have passed, now do something more

       // the scope is retained and you can still refer to the variables you
       // used earlier
       x += 2;
    }

    timer.addEventListener(TimerEvent.TIMER, afterWaiting);
    timer.start();
}
rid
  • 61,078
  • 31
  • 152
  • 193
4

For AS3 use Radu's answer.

For AS2 use the setInterval function like so:

var timer = setInterval(function, 3000, param1, param2);

function (param1, param2) {

// your function here
clearInterval(timer);

}
Community
  • 1
  • 1
George Reith
  • 13,132
  • 18
  • 79
  • 148
4

You can also use delayedCall, from TweenMax. IMHO, it's the sharpest way to do that if you are familiar to TweenMax family.

TweenMax.delayedCall(1, myFunction, ["param1", 2]);

function myFunction(param1:String, param2:Number):void  
{ 
   trace("called myFunction and passed params: " + param1 + ", " + param2); 
}

In your case, using a anonymous function:

public function foo(param1, param2, param3) {
   //do something here
   trace("I gonna wait 3 seconds");

   TweenMax.delayedCall(3, function()
   {
       trace("3 seconds have passed");
   });
}
Marcelo Assis
  • 5,136
  • 3
  • 33
  • 54
3

why you are doing some confused ways instead of doing the right way?

there is a method named:"setTimeout()";

setTimeout(myFunction,3000);

myFunction is the function you want to call after the period.and 3000 is the period you want to wait(as miliseconds).

you don't need to set then clear interval, or make a timer with one repeat count or do sth else with more trouble☺.

HITMAN
  • 538
  • 1
  • 4
  • 13
2

There is no Sleep in ActionScript. But there are other ways to achieve the same thing without having all your code in a single function and wait within that function a specific amount of time.

You can easily have your code in two functions and call the 2nd one after a specific timeout you set in your 1st function.

DanielB
  • 19,910
  • 2
  • 44
  • 50
  • 2
    There is *no* reason? There is also no reason computers should exist. – Christian Aug 15 '12 at 21:07
  • @Christian Care to explain what you can do in a single function that you can't do in a delayed callback? – George Reith Mar 07 '14 at 07:00
  • "No reason" was not meant as an "insult". May be translation word by word from my mothers tongue wasn't that good here :-) I've corrected the statement. – DanielB May 26 '14 at 16:47
0

THIS IS NOT WITHIN ONE FUNCTION - ANSWERS: "How to wait for X seconds in AS2 & 3"

...without using setInterval or clearInterval.

The answers posted above are much faster and easier to use. I posted this here, just in case...

Sometimes you may not be able to use set/clearInterval or other methods based on development restrictions. Here is a way to make a delay happen without using those methods.

AS2 - If you copy/paste the code below to your timeline, make sure to add two movie clips to the stage, btnTest and btnGlowTest (include like instance names). Make "btnGlowTest" larger, a different color, & behind "btnTest" (to simulate a glow and a button, respectively).

Compile and check the output panel for the trace statements to see how the code is working. Click on btnTest - btnGlowTest will then become visible throughout the duration of the delay, (just for visual representation).

I have an onEnterFrame countdown timer in here as well, (demos stopping/switching timers).

If you want the delay/glow to be longer - increase the glowGameTime number. Change the names to fit your own needs and/or apply the logic differently.

var startTime:Number = 0;
var currentTime:Number = 0;
var mainTime:Number = 5;//"game" time on enter frame

var glowStartTime:Number = 0;
var glowCurrentTime:Number = 0;
var glowGameTime:Number = 1.8;//"delayed" time on press

btnGlowTest._visible = false;

this.onEnterFrame = TimerFunction;
startTime = getTimer();

function TimerFunction()
{   
    currentTime = getTimer();   

    var timeLeft:Number = mainTime - ((currentTime - startTime)/1000);

    timeLeft = Math.floor(timeLeft);    
    trace("timeLeft = " + timeLeft);

    if(timeLeft <= 0)
    {
        trace("time's up...3 bucks off");
        //...do stuff here
        btnGlowTest._visible = false;//just for show
        btnTest._visible = false;//just for show
        StopTime();
    }
}

function glowTimerFunction()
{   
    glowCurrentTime = getTimer();   

    var glowTimeLeft:Number = glowGameTime - ((glowCurrentTime - glowStartTime)/1000);  

    glowTimeLeft = Math.floor(glowTimeLeft);    
    //trace("glowTimeleft = " + glowTimeLeft);

    if(glowTimeLeft <= 0)
    {
        trace("TIME DELAY COMPLETE!");
        //...do stuff here
        btnGlowTest._visible = false;//just for show
        btnTest._visible = false;//just for show
        StopTime();
    }
}

btnTest.onPress = function()
{
    trace("onPress");
    btnGlowTest._visible = true;
    StopTime(); 
    GlowTime();
}

function GlowTime()
{
    trace("GlowTime Function"); 
    this.onEnterFrame = glowTimerFunction;  
    glowStartTime = getTimer();
}

function StopTime()
{
    trace(">>--StopTime--<<");
    delete this.onEnterFrame;   
}

AS3 - Below is the code from above setup to run in AS3. There are different ways to accomplish similar results, yet based on the project scope, these are the methods that were used in order to get things functioning properly.

If you copy/paste the code below to your timeline, make sure to add two movie clips to the stage, btnTest and btnGlowTest (include like instance names). Make "btnGlowTest" larger, a different color, & behind "btnTest" (to simulate a glow and a button, respectively).

Compile and check the output panel for the trace statements to see how the code is working. Click on btnTest - btnGlowTest will then become visible throughout the duration of the delay, (just for visual representation).

If you want the delay/glow to be longer - increase the GlowTimer:Timer number, (currently set to 950). Change the names to fit your own needs and/or apply the logic differently.

import flash.events.MouseEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;

var startTime:Number = 0;
var currentTime:Number = 0;
var gameTime:Number = 4;//"game" time on enter frame

var GlowTimer:Timer = new Timer(950,0);//"delayed" time on press

btnGlowTest.visible = false;

GlowTimer.addEventListener(TimerEvent.TIMER, GlowTimeListener, false, 0, true);
btnTest.addEventListener(MouseEvent.MOUSE_DOWN, btnTestPressed, false, 0, true);
addEventListener(Event.ENTER_FRAME,TimerFunction, false, 0, true);

startTime = getTimer();

function TimerFunction(event:Event)
{   
    currentTime = getTimer();

    var timeLeft:Number = gameTime - ((currentTime - startTime)/1000);  

    timeLeft = Math.floor(timeLeft);
    trace("timeLeft = " + timeLeft);

    if(timeLeft <= 0)
    {
        trace("time's up, 3 bucks off");
        StopTime();
    }   
}

function GlowTimeListener (e:TimerEvent):void
{
    trace("TIME DELAY COMPLETE!");      
    StopTime();
}

function btnTestPressed(e:MouseEvent)
{   
    trace("PRESSED");       
    removeEventListener(Event.ENTER_FRAME, TimerFunction);
    btnGlowTest.visible = true;
    GlowTimer.start();
}

function StopTime()
{
    trace(">>--Stop Time--<<");
    btnGlowTest.visible = false;//just for show
    btnTest.visible = false;//just for show
    GlowTimer.stop();
    removeEventListener(TimerEvent.TIMER, GlowTimeListener);
    removeEventListener(Event.ENTER_FRAME, TimerFunction);
}
CrabMan
  • 1
  • 1