2010-03-17 30 views
5

creo que podría estar cansado, pero no puedo por la vida de mí darle sentido a esto, y creo que es debido a una falta de conocimiento de JavascriptJavaScript setTimeout setInterval dentro de una función

var itv=function(){ 
return setInterval(function(){ 
    sys.puts('interval'); 
}, 1000); 
} 
var tout=function(itv){ 
return setTimeout(function(){ 
    sys.puts('timeout'); 
    clearInterval(itv); 
}, 5500); 
} 

Con estos dos funciones Puedo llamar a

a=tout(itv()); 

y obtener un temporizador de bucle para ejecutar durante 5,5 segundos y luego salir, esencialmente.



Por mi lógica, esto debería funcionar, pero simplemente no es

var dotime=function(){ 
return setTimeout(function(){ 
    clearInterval(function(){ 
    return setInterval(function(){ 
    sys.puts("interval"); 
    }, 1000); 
    }); 
}, 5500); 
} 

alguna idea en esta materia sería apreciada.

Respuesta

7

no puede trabajar porque debido a que su setInterval se llamará después el tiempo de espera! su enfoque original es correcta y todavía se puede envolver esto en una sola función:

var dotime=function(){ 
    var iv = setInterval(function(){ 
    sys.puts("interval"); 
    }, 1000); 
    return setTimeout(function(){ 
    clearInterval(iv); 
    }, 5500); 
}; 
+0

Esto es definitivamente. No crea el intervalo hasta que se ejecuta la devolución de llamada de tiempo de espera. –

+0

Gracias por la llamada de atención/respuesta concisa, no sé lo que estaba pensando – dagoof

+0

+1, cierre la magia como mejor. –

4

Creo que el error que está haciendo es que la función no devuelve itvsetInterval(function(){ sys.puts('interval'); }, 1000) se ejecuta setInterval(function(){ sys.puts('interval'); }, 1000) y que retorna un identificador que genera setInterval. Esa ID luego se pasa a la función clearInterval para detener lo que setInterval(function(){ sys.puts('interval'); }, 1000) está haciendo.

Editar: Un ejemplo de una función que funcionaría.

 
var dotime=function(){ 
// Start our interval and save the id 
var intervalId = setInterval(function(){ 
    // This will get executed every interval 
    sys.puts("interval"); 
}, 1000); 

// Start our timout function 
setTimeout(function(){ 
    // This will get executed when the timeout happens 
    clearInterval(intervalId); // Stop the interval from happening anymore 
}, 5500); 
} 
+0

Agradable, esto funciona – user460114

1

Ésta es otra manera de escribir su versión, se ve que se pasa una función de clearInterval, donde debe haber pasado un Identificación del temporizador .

var dotime=function(){ 
var g=function(){ 
    var f=function(){ 
    return setInterval(function(){ 
    sys.puts("interval"); 
    }, 1000); 
    } 
    clearInterval(f); 
} 
return setTimeout(g, 5500); 
} 

Para que funcione se deberían poner llama a la función:

clearInterval(f()); 

O, usando la versión:

var dotime=function(){ 
return setTimeout(function(){ 
    clearInterval(function(){ 
    return setInterval(function(){ 
    sys.puts("interval"); 
    }, 1000); 
    }()); 
}, 5500); 
} 

de responsabilidad: No he probado esto.

Cuestiones relacionadas