2012-02-11 11 views
16

Dado que los trabajadores de la web niegan las desventajas de la ejecución detenida en JavaScript, ya que no bloquearán la IU, ¿existe un método confiable para obtenerlos en Sleep?¿Es posible hacer que los Trabajadores web duerman?

¿Por un tiempo designado, o hasta que reciban un mensaje?

Respuesta

4

Webworkers son esencialmente funciones que se llaman a través de onMessage, por lo que hacer que duerman debería ser simplemente una cuestión de enviar un mensaje específico a después de un cierto período de tiempo.

A diferencia de los hilos en idiomas como Java, WebWorkers no necesita operar en un bucle continuo (y CPU) para conservar la utilidad; se pueden enviar mensajes tantas veces como desees.

En este ejemplo, el trabajador 'duerme' mientras espera la entrada del usuario.

index.html:

<script> 
    var worker = new Worker("worker.js"); 

    worker.onmessage = function(e) { 
     console.log("Send and recieved " + e.data); 
    } 

    function tellWorker(element) { 
     var data = element.value; 
     worker.postMessage(data); 
    } 

</script> 

worker.js:

self.onmessage = function(e) { 
    self.postMessage(e.data); 
} 

Perdóname si leído mal su pregunta.

Editar: Otra posibilidad es, suponiendo que el WebWorker se está ejecutando en un bucle setTimeout, escucha un mensaje que podría llamar clearTimeout mientras un usuario está haciendo algo.


Actualización:

Este código crea un objeto, modificarlo a través del trabajador, y luego modificarlo de nuevo después de la página principal ajusta una bandera:

index.html:

<input type="button" value="start" onclick="startWork()" /><br> 
<input type="button" value="passObject" onclick="finishWork()" /> 

<script> 
    var worker = new Worker("worker.js"); 

    var incompleteObject = { 
     val  : 0, 
     done : false 
    }; 


    worker.onmessage = function(e) { 
     console.log("Exit Status: "); 
     console.log(e.data); 
    } 

    function startWork() { 
     worker.postMessage(incompleteObject); 
    } 
    function finishWork() { 
     incompleteObject.done = true; 
     worker.postMessage(incompleteObject); 
    } 

</script> 

worker.js:

self.onmessage = function(e) { 

    var obj = e.data; 

    if(obj.done == false) { 
     obj.val = 2; 
    } else { 
     obj.val = 4; 
    } 

    self.postMessage(obj); 

} 
+0

Su respuesta tiene mucho sentido, entiendo a los trabajadores. Sin embargo, lo que quiero lograr no se puede hacer así. Básicamente, quiero que el trabajador solicite un objeto al padre en el medio de un bloque de ejecución. El trabajador debe entonces 'esperar' a que el Objeto sea devuelto antes de que pueda continuar. – Jivings

+0

@Jivings ¿podrías dividir el proceso en dos funciones? Es posible que necesitemos ver algún código de muestra, aunque creo que sé lo que quiere lograr ahora. Actualizaré mi respuesta. –

+0

Creo que dividir el problema en dos es hacia dónde me dirijo. – Jivings

3

setTimeout y setInterval están disponibles para los trabajadores de la web. Entonces, si quiere 'esperar' su código, esta puede ser la mejor solución.

+1

Gracias, lamentablemente, no quiero esperar un intervalo específico. Quiero que el método se detenga en el medio de la ejecución hasta que reciba un mensaje. – Jivings

Cuestiones relacionadas