2013-05-16 6 views
6

私は問題に対してエレガントで効率的な解決策を探しています:イベントがトリガーされた関数の実行を続行するために、イベントが処理されるのを待っています。

私はこのwebappに多くのコンポーネントがあります。

1つの主なコンポーネントには、時間と共に成長/進化する多くの機能が含まれています。

このメインコンポーネントには、実際に行う前に、アドオンが聴くことができるように、イベントbeforedoがトリガーされるという機能があります。アドオンコード

$doc.on('beforedo',function(e) { 
    //do before addon stuff 
} 

dostg : function() { 
    $doc.trigger('beforedo'); 

    //do stuff but after event is handled by the addons ? 

} 

今、それらのものをやってはある程度の処理時間がかかるAjaxのリクエストか何かを含むことができる前に。

私はajaxリクエストのカウンタをインクリメントして、それがnilになるのを待つことができますが、私が望むのは、すべてのハンドラが自分の仕事を終えるのを待っているソリューションだからです。これらのアドオンハンドラで行われます)。

これを行うにはいくつかの奇跡の解決策がありますか、このような状況でイベントを忘れて別の方法(配列の新しい機能を追加するaddons関数の配列)に行く必要がありますか?

あなたの専門知識をお寄せいただきありがとうございます。

------- BOUNTY

& @Sergiu Paraschivを@xbonezに謝罪、私は編集私は報奨金を提供して前に、今使用している溶液で質問を持っている必要があります(ソリューションFOLLOWING EDIT私は完全に満足していないので、恩恵を受けます)。私はアドオンbeforedoで何かをする必要がない場合でも、私はまだアドオンの少なくとも一方で(addonreadyトリガするためのハンドラを追加する必要があるため

//app 
var $doc = $(document.body); 


//component  
$doc.on({ 
    wait: function (e) { ++$doc.component.handleinprogress; }, 

    addonready: function() { 
     --$doc.component.handleinprogress; 
     if ($doc.component.handleinprogress==0) $doc.trigger('readyfordo'); 
    }, 

    readyfordo: function() { 
     //do stuff after event has been handled by the addons 
    }   
}); 

$doc.component = { 
    handleinprogress: 0, 
    dostg: function() { 

     $doc.component.handleinprogress = 0; 
     $doc.trigger('beforedo'); 
    } 
}; 

//in component addon files 

$doc.on('beforedo', function (e) { 

    $doc.trigger('wait'); 
    //do addon stuff 
    $doc.trigger("addonready"); 
} 

私は、このソリューションに満足していませんよ - >そのため、私は、readyfordoがトリガされるかどうかを気にせずにコンポーネントからaddonを追加/削除する柔軟性を失うか、すべてのアドオンにハンドラを含める必要があります。

答えて

関連する問題