我正在寻找一个优雅、有效的解决方案来解决我的问题:
我有这个包含许多组件的 webapp;
一个主要组成部分包括许多将随着时间增长/演变的附加内容。
这个主要组件有一个功能,在实际做它应该做的事情之前,它会触发一个事件 beforedo 以便插件可以监听。
dostg : function () {
$doc.trigger('beforedo');
//do stuff but after event is handled by the addons ?
}
在插件代码中
$doc.on('beforedo',function(e) {
//do before addon stuff
}
现在那些在做事情之前可能会涉及 ajax 请求或任何需要一些处理时间的事情。
我可以在 ajax 请求上增加一个计数器并等待它降至零,但我想要的是一个解决方案,它只会等待所有处理程序完成他们的工作(因此无论在这些插件中做什么都可以处理程序)。
是否有一些神奇的解决方案可以做到这一点,或者我必须在这种情况下忘记事件并采取另一种方式(要迭代的函数数组,插件将新函数推入数组)?
感谢您的专业知识!
-------在赏金之后编辑
向@xbonez 和@Sergiu Paraschiv 道歉,我应该在提供赏金之前使用我现在使用的解决方案编辑问题(我并不完全满意的解决方案,因此是赏金)。
//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是否被触发,要么我必须在每个插件中包含处理程序——大部分是-75%——一无所获)。