2012-03-28 5 views
2

(具体的には、私はバックボーンモデルイベントを使用しています)Javascriptイベントハンドラはブロックされますか?

JavaScriptのイベントの仕組みを理解できたら助けてくれますか?以下は、私が期待される方法を動作していない、それが混乱し私を残しています:バックボーンで

を、私は私のモデルに変更を加え、その直後、私はいくつかのコードを実行します。そして、どこか私の中

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

を私は(私の場合、私はコレクションでこのモデルをラップしています)イベントを監視し、それを扱うコードベース:

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

私が見つけてる何がmyVar = executeSomeFunc()change:someAttrイベントに関するすべてのイベントハンドラまで実行されていないということです発砲される。 (私は時間のかかるイベントハンドラをイベントに付けることでチェックしました)

これは予想される動作ですか?

答えて

4

はい。 JavaScriptはマルチスレッド化されていません。イベントをトリガーすると、すべてのイベントハンドラーがすぐに実行されます。

+0

私の理解では、イベントハンドラは "トリガ"と同期して動作しますが、イベントハンドラ関数内では通常の意味を持っています。つまり、関数呼び出し境界で別の待機イベントハンドラあなたのイベントハンドラの中で呼び出します。それは間違っていますか? –

+0

うわー...理由は分かりませんが、これはまったく私のカーブを通っています...私はいつも、このものはすべて非ブロックであると仮定してきました! jsのレッスンをありがとう101 – uglymunky

+0

jQueryは、少なくともハンドラがバインドされた順に実行されるように指定しています。それは収穫がないということを私に暗示します。基本的なJavaScriptがこのように機能するのは私の理解であり、拘束力のあるイベントは本質的にただちに実行されるメソッドのキューです。本当に収穫の概念はありません。 – bhamlin

1

javascriptブロックのすべては、それはいつに依存しますか。ハンドラを他の関数に設定した場合は、ハンドラのイベントを起動し、他の関数を実行して、それらを列挙した順序で実行します。イベントハンドラのポイントは、何かをトリガするときにコードを実行することですが、決して非同期ではありません。それであなたの答えは、これが期待される行動だということです。天国とJavascriptの地獄を理解するためには、Crockfordのjavascriptに関するスピーチを探してください。

これが役に立ちます。

関連する問題