2010-11-16 12 views
5

Necesito dejar que un fragmento de código siempre se ejecute independientemente de otro código. ¿Hay alguna manera de crear un hilo en javascript para ejecutar esta función?Hilos (o algo así) en javascript

setTimeout --¿Por qué no funcionó para mí

lo probé, pero se ejecuta una sola vez. Y si llamo recursivamente a la función, arroja el error "demasiada recursividad" después de un tiempo. Lo necesito corriendo cada 100 millones (es una comunicación con un sistema integrado).

--como le preguntas, aquí va algo de código

function update(v2) { 
    // I removed the use of v2 here for simplicity 
    dump("update\n"); // this will just print the string 
    setTimeout(new function() { update(v2); }, 100); // this try doesn't work 
} 
update(this.v); 

Se lanza "demasiado recursividad".

+0

Me gustaría ver algún código :) tal vez algo se puede mejorar ... –

+0

@fcalderan allí está –

+0

bien, 1) ¿qué descarga() hace? 2) ¿por qué pasas una discusión si no la usas? 3) ¿Qué try/catch está tratando de atrapar? =) 4) ¿Por qué creas una instancia de una función? si elimina el 'nuevo' constructor? ¿Cuál es el propósito de este código? –

Respuesta

2

Deshacerse de la palabra clave new de la función que está pasando a setTimeout(), y debería funcionar.

function update(v2) { 
try { 
    dump("update\n"); 
} catch(err) { 
    dump("Fail to update " + err + "\n"); 
} 
setTimeout(function() { update(v2); }, 100); 
} 
update(this.v); 

O simplemente usa setInterval().

function update(v2) { 
try { 
    dump("update\n"); 
} catch(err) { 
    dump("Fail to update " + err + "\n"); 
} 
} 
var this_v = this.v; 
setInterval(function() {update(this_v);}, 100); 

EDIT: referenciado this.v en una variable, ya que no sé lo que el valor de this está en su aplicación.

2

window.setTimeout() es lo que necesita.

+0

¿Qué tal setInterval? – Stephen

+0

Sí, setInterval() sería lo que necesita. –

+0

Lo probé, funciona solo una vez. Y si llamo recursivamente a la función, arroja el error "demasiada recursividad" después de un tiempo. –

4

Supongo que está preguntando acerca de la ejecución de una función en un hilo diferente. Sin embargo, Javascript no es compatible con multihilo.

Ver: Why doesn't JavaScript support multithreading?

El motor de Javascript en todos los navegadores actuales ejecutan en un solo hilo. Como se indica en la publicación anterior, la ejecución de funciones en un hilo diferente generaría problemas de concurrencia. Por ejemplo, dos funciones que modifican un solo elemento HTML simultáneamente.

3

Como señalaron otros aquí, quizás el multi-threading no es lo que realmente necesita para su situación. setInterval puede ser adecuado.

Sin embargo, si realmente necesita varios subprocesos, JavaScript sí lo admite a través de la funcionalidad de los trabajadores web. Básicamente, el hilo principal de JavaScript puede interactuar con los otros hilos (trabajadores) solo a través de eventos y pasando mensajes (cadenas, esencialmente). Los trabajadores no tienen acceso al DOM. Esto evita cualquiera de los problemas de concurrencia.

Aquí son los trabajadores web de Especificaciones: http://www.whatwg.org/specs/web-workers/current-work/

Un tratamiento más tutorial: http://ejohn.org/blog/web-workers/

+0

Tenga en cuenta que los trabajadores web no son compatibles actualmente con ninguna versión de Internet Explorer. –

0

U puede tratar un bucle en lugar de recursividad

+0

un bucle bloquea tu aplicación –

1

quizás debería ver sobre los trabajadores de javascirpt (los trabajadores web dedicados proporcionan un medio simple para que el contenido web ejecute scripts en hilos de fondo), aquí un artículo agradable que explica cómo funciona y cómo podemos usarlo. HTML5 web mobile tutororial

Cuestiones relacionadas