2012-03-28 14 views
2

(genauer gesagt, ich bin mit Backbone Modell Ereignissen)Blockieren JavaScript-Ereignishandler?

Kann mir jemand helfen zu verstehen, wie JavaScript-Ereignisse arbeiten? Das Folgende ist nicht die Art und Weise arbeiten ich erwartet hatte und es hat mich verwirrt:

In Rückgrat, mache ich eine Änderung an meinem Modell, und unmittelbar danach laufe ich einige Code:

var myVar; 
myModel.set('someAttr', true); // Change my model 
myVar = executeSomeFunc(); // Now run some code 

Dann woanders in meinem Codebasis ich für die Veranstaltung zu hören und zu handhaben es (in meinem Fall habe ich dieses Modell mit einer Sammlung bin Verpackung):

myCollection.on('change:someAttr', changeHandler); // Listen for the event 

Was ich finde, ist, dass myVar = executeSomeFunc() nicht, bis alle Event-Handler auf dem change:someAttr Ereignis ausgeführt wird sind getan Brennen. (Ich habe überprüft, indem ich einen zeitaufwendigen Event-Handler an das Ereignis angehängt habe)

Ist dieses erwartete Verhalten?

Antwort

4

Ja. JavaScript ist nicht Multithread. Wenn Sie Ereignisse auslösen, werden alle Ereignishandler sofort ausgeführt.

+0

Mein Verständnis war, dass der Event-Handler synchron mit dem "Trigger" läuft, aber dass Sie normale Semantik innerhalb der Event-Handler-Funktion bekommen - dh - es könnte einen anderen wartenden Event-Handler an Funktions-Aufruf Grenzen - sagen, Funktion ruft innerhalb Ihres Event-Handlers auf. Ist das falsch? –

+0

Wow ... ich weiß nicht warum, aber das ist nur total durch mich für eine Kurve ... Ich habe immer angenommen, dass dieses Zeug nicht blockierend war! Danke für die Lektion in js 101 – uglymunky

+0

jQuery, mindestens, legt fest, dass Handler in der Reihenfolge ausgeführt werden, in der sie gebunden sind. Das würde bedeuten, dass es kein Nachgeben gibt. Es ist mein Verständnis, dass grundlegende Javascript funktioniert auch so - Bindung Ereignisse ist im Wesentlichen nur eine Warteschlange von Methoden, die nacheinander ausgeführt werden. Es gibt wirklich kein Konzept des Nachgebens. – bhamlin

1

Alles in JavaScript-Blöcken, es kommt nur darauf an, wann. Wenn Sie einen Handler auf die anderen Funktionen setzen, das Ereignis für den Handler auslösen und andere Funktionen ausführen, wird es in genau der Reihenfolge ausgeführt, in der ich sie aufgelistet habe. Der Punkt von Event-Handlern ist, Code auszuführen, wenn etwas ausgelöst wird, aber es wird niemals asynchron sein. Also die Antwort für Sie ist, dass dies das erwartete Verhalten ist. Um den Himmel und die Hölle von Javascript zu verstehen, suchen Sie einfach nach Crockfords Reden über Javascript.

Hoffe, das hilft.