¿Cómo esperar 3 segundos en ActionScript 2 o 3?

¿Hay alguna forma de implementar esperando, digamos, 3 segundos en ActionScript, pero permanecer dentro de la misma función? He buscado setInterval, setTimeOut y funciones similares, pero lo que realmente necesito es esto:

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

En caso de que se pregunte por qué necesito esto, es un requisito legal y no, no puedo cambiarlo.

preguntado el 08 de noviembre de 11 a las 14:11

necesitará tener funciones separadas o subfunciones para evitar que el código se bloquee. -

El bloqueo está bien. De hecho, yo quieres todo para ser bloqueado durante 3 segundos. -

No, no lo haces. 3 segundos de bloqueo de código pueden bloquear un navegador. Lo que desea es esperar e ignorar todas las entradas del usuario, que es claramente diferente. -

Mi código está muy por debajo de una capa de interfaz de usuario. No tengo absolutamente ningún control de la interfaz de usuario. -

6 Respuestas

Utiliza Timer para llamar a una función después de 3 segundos.

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

Para hacer esto correctamente, debe crear el temporizador como una variable de instancia para que pueda eliminar el oyente y la instancia del temporizador cuando se llama a la función, para evitar fugas.

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

También puede utilizar otra función dentro de su foo funcionar y conservar el alcance, por lo que no es necesario pasar variables.

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

respondido 08 nov., 11:19

Para uso AS3 La respuesta de Radu.

Para AS2 utilice el setInterval funcionar así:

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

function (param1, param2) {

// your function here
clearInterval(timer);

}

contestado el 23 de mayo de 17 a las 13:05

También podrías usar setTimeout(function() { ... }, 3000); (nada que borrar). - librar

También puedes usar retrasada, de TweenMax. En mi humilde opinión, es la forma más nítida de hacerlo si está familiarizado con la familia TweenMax.

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

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

En su caso, utilizando un anónimo función:

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

   TweenMax.delayedCall(3, function()
   {
       trace("3 seconds have passed");
   });
}

respondido 08 nov., 11:19

En este proyecto tengo que usar AS puro, sin bibliotecas adicionales, pero gracias por la información. - TheJavaGuy-Ivan Milosavljević

¿Por qué estás haciendo algunas cosas confusas en lugar de hacerlo de la manera correcta?

hay un método llamado: "setTimeout ()";

setTimeout(myFunction,3000);

myFunction es la función que desea llamar después del período y 3000 es el período que desea esperar (en milisegundos).

no es necesario establecer y luego borrar el intervalo, o hacer un temporizador con un conteo repetido o hacer algo más con más problemas☺.

Respondido el 01 de junio de 15 a las 08:06

No hay Sleep en ActionScript. Pero hay otras formas de lograr lo mismo sin tener todo su código en una sola función y esperar dentro de esa función una cantidad de tiempo específica.

Puede tener fácilmente su código en dos funciones y llamar a la segunda después de un tiempo de espera específico que estableció en su primera función.

contestado el 26 de mayo de 14 a las 20:05

No hay no ¿razón? Tampoco hay ninguna razón por la que deberían existir las computadoras. - cristiano

@Christian Care para explicar lo que puede hacer en una sola función que no puede hacer en una devolución de llamada retrasada? - George Reith

"No hay motivo" no fue un "insulto". Puede que la traducción palabra por palabra de la lengua de mi madre no fuera tan buena aquí :-) He corregido la afirmación. - DanielB

ESTO NO ESTÁ DENTRO DE UNA FUNCIÓN - RESPUESTAS: "Cómo esperar X segundos en AS2 y 3"

...sin utilizando setInterval o clearInterval.

Las respuestas publicadas anteriormente son mucho más rápidas y fáciles de usar. Publiqué esto aquí, por si acaso ...

A veces es posible que no pueda usar set/clearInterval u otros métodos basados ​​en restricciones de desarrollo. Aquí hay una manera de hacer que ocurra un retraso sin usar esos métodos.

AS2 - Si copia / pega el código a continuación en su línea de tiempo, asegúrese de agregar dos clips de película al escenario, btnTest y btnGlowTest (incluir nombres de instancias similares). Haga "btnGlowTest" más grande, de un color diferente y detrás de "btnTest" (para simular un brillo y un botón, respectivamente).

Compile y revise el panel de salida para ver las declaraciones de seguimiento para ver cómo está funcionando el código. Haga clic en btnTest; btnGlowTest se hará visible durante la duración del retraso (solo para representación visual).

También tengo un temporizador de cuenta atrás onEnterFrame aquí (demostraciones de interrupción / cambio de temporizadores).

Si desea que el retardo / brillo sea más largo, aumente el glowGameTime número. Cambie los nombres para que se ajusten a sus propias necesidades y / o aplique la lógica de manera diferente.

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 - A continuación se muestra el código de la configuración anterior para ejecutarse en AS3. Hay diferentes formas de lograr resultados similares, pero según el alcance del proyecto, estos son los métodos que se utilizaron para que las cosas funcionen correctamente.

Si copia / pega el código a continuación en su línea de tiempo, asegúrese de agregar dos clips de película al escenario, btnTest y btnGlowTest (incluir nombres de instancias similares). Haga "btnGlowTest" más grande, de un color diferente y detrás de "btnTest" (para simular un brillo y un botón, respectivamente).

Compile y revise el panel de salida para ver las declaraciones de seguimiento para ver cómo está funcionando el código. Haga clic en btnTest; btnGlowTest se hará visible durante la duración del retraso (solo para representación visual).

Si desea que el retardo / brillo sea más largo, aumente el GlowTimer:Timer número, (actualmente establecido en 950). Cambie los nombres para que se ajusten a sus propias necesidades y / o aplique la lógica de manera diferente.

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

Respondido 21 Jul 15, 23:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.