Frage an jquery, thread-safety, oop, multithreading, javascript – Kann die Ausführung der JavaScript-Funktion unterbrochen werden?

2

Ein Objekt zum Speichern von Daten haben.

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

Das Speichern von Daten erfolgt aus zwei Ereignissen (Art von zwei Produzenten). Erster "Produzent" löst kein Ereignis aus:

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

Die Sekunde löst Ereignisse aus:

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

Die Frage ist, kann der zweite Produzent den Ausführungsfluss des ersten Produzenten unterbrechen?

Ich meine, wenn Produzent 1 Ereignisse deaktiviert und bevor die Ausführung abgeschlossen ist (und daher Ereignisse wieder aktiviert werden), startet Produzent 2 seine Ausführung und fügt sein Element hinzu, werden keine Ereignisse ausgelöst. Ist das möglich? Kann das passieren?

Wenn ja, wie kann dieser Code so konvertiert werden, dass er Thread-sicher ist?

Deine Antwort

3   die antwort
3

werden, sodass Sie sicher sein können, dass jeder Funktionsblock abgeschlossen wird, bevor ein anderer beginnt.

(Wenn jedoch eine Funktion einen asynchronen Aufruf ausführt, werden möglicherweise andere Funktionen ausgeführt, bevor die asynchrone Operation gestartet wird. Dies ist jedoch in Ihrem Code nicht der FallsetTimeout Anrufe, und Sie können sicher sein, dass diese in der richtigen Reihenfolge ausgeführt werden.)

4

Wäre es nicht sinnvoller, das zu bestehen?eventsEnabled als Parameter für dieaddElement Methode?

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

Zuerst:

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

Zweite:

<code>setInterval(function() {
    store.addElement('bye',true);
}, 12000);
</code>
Großartiger Rat Jamiec, du hast meine +1 bekommen. Apsillers beantwortete meine Frage. German Latorre
du hast mich geschlagen !! :) bPratik
0

Event-Funktion ansehen:

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

Als solches verwendet:

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

Wenn also ein Ereignis benötigt wird, können Sie es weitergeben oder einfach weglassen.

Verwandte Fragen