2012-03-13 4 views
0

いくつかのイベントのすべてのイベントハンドラが完了したときに、何らかのアクションを実行しようとしています。バックボーン内のすべてのイベントハンドラを待つ方法は?

私の考えでは、イベント内のオブジェクトを渡すことだった:

self.trigger("my_event", {handlers: x, callback: function}); 

とハンドラで、私は何か書きたい:(明らかにそれは、ロックオブジェクトの責任があると思い

handler = function(lock){ 
    lock.handlers --; 
    if (lock.handlers == 0){ 
    lock.callback(); 
    } 
} 

しかし、私のイベントに登録されているハンドラの数(私の例ではx)の情報を取得する方法がわかりません。これは可能ですか?これを行うには他の方法がありますか?

+1

また、jQueryを使用している場合は、Deferredオブジェクトの機能を使用できます。http://api.jquery.com/category/deferred-object/&http://www.erichynds.com/jquery/ using-deferreds-in-jquery /、特に 'jQuery.when()'関数:http://api.jquery.com/jQuery.when/ – biziclop

答えて

1

登録されたハンドラはすべて、「トリガ」機能自体によって呼び出されます。その呼び出しが返ってくると、ハンドラのそれぞれも持っています。この例を考えてみましょう。

function checkTriggers() { 
    var o = {}; 
    _.extend(o, Backbone.Events); 
    o.on('foo', function(){console.log('ONE');}); 
    o.on('foo', function(){console.log('TWO');}); 
    o.trigger('foo'); 
    console.log('THREE'); 
} 

ログシーケンスは常に1つ、2つ、3つです。だから、あなたは単に "トリガ"の呼び出しの後にあなたの行動を実行することができるように思えます。しかし、コールバック関数が遅延を使用すると(たとえば "setTimeout"で)、別の問題が発生します。

関連する問題