Pregunta sobre multithreading, jquery, javascript, oop, thread-safety – ¿Se puede interrumpir la ejecución de la función JavaScript?

2

Tener un objeto para almacenar datos.

<code>var store = {
    elements: [],
    eventsEnabled: true,
    addElement: function(element) {
        this.elements.push(element);
        if (this.eventsEnabled) {
            // Code that triggers event, calls handlers... whatever
        }
    }
};
</code>

El acto de almacenar datos proviene de dos eventos (tipo de dos productores). Primer "productor" no desencadena ningún evento:

<code>setInterval(function() {
    store.eventsEnabled = false;
    store.addElement('hello');
    store.eventsEnabled = true;
}, 12000);
</code>

El segundo desencadena eventos:

<code>setInterval(function() {
    store.addElement('bye');
}, 7000);
</code>

La pregunta es, ¿puede el segundo productor interrumpir el flujo de ejecución del primer productor?

Quiero decir, si el productor 1 desactiva los eventos y, antes de finalizar la ejecución (y, por lo tanto, antes de que los eventos se vuelvan a habilitar), el productor 2 comienza su ejecución y agrega su elemento, entonces no se activará ningún evento. ¿Es eso posible? ¿Puede eso suceder?

Si es así, ¿cómo se puede convertir este código para que sea seguro para subprocesos?

Tu respuesta

3   la respuesta
3

JavaScript es de un solo hilo. Una función no se puede interrumpir, por lo que puede estar seguro de que cada bloque de funciones se completará antes de que comience otro.

(Sin embargo, si una función hace una llamada asíncrona, otras funciones pueden ejecutarse antes de que comience la operación asíncrona. Sin embargo, eso no sucede en su código, eso puedo verlo, además desetTimeout llamadas, y puede estar seguro de que se ejecutarán en el orden correcto.)

0

Además de la sugerencia de @Jamiec, también puede ver cómo se pasa la función de evento:

<code>var store = {
    elements: [],
    addElement: function(element, callback) {
        this.elements.push(element);
        if (callback !== undefined) {
            callback();
            // Common code that triggers event, calls handlers... whatever
            alert("I'm Common Event Code");
        }
    }
};​
</code>

Utilizado como tal:

<code>setInterval(function() {
    store.addElement('hello', function(){ alert("I'm Special Event Code!"); });
}, 12000);
</code>

Por lo tanto, si se necesita un evento, puede pasarlo, de lo contrario, simplemente omítalo.

4

¿No sería más sensato pasar eleventsEnabled en como un parámetro a laaddElement ¿método?

<code>var store = {
    elements: [],
    addElement: function(element,eventsEnabled) {
        this.elements.push(element);
        if (eventsEnabled) {
            // Code that triggers event, calls handlers... whatever
        }
    }
};
</code>

Primero:

<code>setInterval(function() {
    store.addElement('hello',false);
}, 12000);
</code>

Segundo:

<code>setInterval(function() {
    store.addElement('bye',true);
}, 12000);
</code>
me venciste a esto !! :) bPratik
Gran consejo Jamiec, tienes mi +1. Apsillers respondió a mi pregunta sin embargo. German Latorre

Preguntas relacionadas