2012-12-18 23 views
10

私は、複数の子ビューを管理するための一般的なバックボーンビューを構築しています。これらのビューをレンダリングする前にこれらのビューを準備するロジックを実行する必要があることがあります。 trigger()によって呼び出されたイベントは、このように彼らはrender()行の前に、すべての仕上げが呼ばれるだろうことを保証する、同期的に実行されますがバックボーンのトリガー()は同期または非同期ですか?

view = new (this.child_view); 
this.trigger('pre_render', view); 
view.render(); 

:私はこのような、pre_renderフックを有効にするには、バックボーンのイベントを使用して検討していますか?

答えて

11

基本的には、同期しています。

trigger: function(name) { 
    if (!this._events) return this; 
    var args = slice.call(arguments, 1); 
    if (!eventsApi(this, 'trigger', name, args)) return this; 
    var events = this._events[name]; 
    var allEvents = this._events.all; 
    if (events) triggerEvents(this, events, args); 
    if (allEvents) triggerEvents(this, allEvents, arguments); 
    return this; 
}, 

インポート機能がtriggerEventsあり、実際のハンドラを呼び出します。

はここでソースから関連するセクションです。 commentsによれば、最適化されたディスパッチャです。彼らはすべて.call().apply()を呼び出しているので、コントロールが呼び出し元に返される前にコールバックが完了することに注意してください。

var triggerEvents = function(obj, events, args) { 
    var ev, i = -1, l = events.length; 
    switch (args.length) { 
    case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); 
    return; 
    case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0]); 
    return; 
    case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0], args[1]); 
    return; 
    case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, args[0], args[1], args[2]); 
    return; 
    default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); 
    } 
}; 

他の人が述べたように、しかし、トリガーハンドラは、彼らが傾いている場合は、独自のコールバックをスケジュールするのは自由です。したがって、ハンドラが復帰する前に作業を終了するかどうかは、ハンドラコードそのものに依存します。

2

はい、同期しています。ただし、このイベントによってトリガされる関数は、setTimeoutを使用するか、ajaxリクエストを行うことができます。もしそうであれば、trigger呼び出しが戻り、コードがrenderに進むまでに完了しません。したがって、すべてのバインドされたイベントハンドラはが呼び出され、が呼び出されますが、必ずしもすべての処理が完了するとは限りません。トリガAPI自体はコールバックや約束を使用しないため、すべてのイベントハンドラがいつ完了するかを簡単に知る方法はありません。必要に応じて、このようなAPIを自分で実装し、すべての非同期処理を含むすべての処理が完了したら別個のイベントを発生させる必要があります。しかし、日々のプログラミングでは、これらのイベントハンドラのほとんどは同期的であり、そうでない場合、コードは通常、進行することによってアプリケーションが誤動作しないように構成されています。この契約を変更する必要がある場合は、アプリケーション設計がイベントシステムを使用して調和していないというコードの匂いがあり、問題に対するさまざまなアプローチについて考える必要があります。

1

トリガはソースコードに従って同期していますが、 "pre_render"イベントをリッスンするすべての関数が では同期操作を実行するわけではありません。 PS:ソースコードを読み、本当に簡単です、あなたが本当にそれを見ている必要があります

http://backbonejs.org/docs/backbone.html

+1

を私は間違いなく、注釈付きソースが便利。私は、このような質問に答えるときに紙の跡を残すのが大好きです。ありがとう! –

関連する問題