所以,我正在写一个网络应用程序.几乎所有的事情都是客户端,服务器只是一个RESTful的界面.我使用jQuery作为我的框架选择,并在
Revealing Module Pattern中实现我的代码.
我的代码的线框基本如下所示:
@H_404_4@(function($){ $.fn.myplugin = function(method) { if (mp[method]) { return mp[method].apply(this,Array.prototype.slice.call(arguments,1)); } else if (typeof method === 'object' || ! method) { return mp.init.apply(this,arguments); } else { $.error('Method ' + method + ' does not exist on $.myplugin'); } }; var mp = { init : function( options ) { return this.each(function() { // stuff } },callbacks : {},addCallback : function(hook_name,cb_func,priority) { // some sanity checking,then push cb_func onto a stack in mp.callbacks[hook_name] },doCallbacks : function(hook_name) { if (!hook_name) { hook_name = arguments.callee.caller.name; } // check if any callbacks have been registered for hook_name,if so,execute one after the other } }; })(jQuery);很简单,对吧?
现在,我们可以从内部以及从应用程序范围之外注册(多个,分层)回调.
什么是欺骗我:为了使整个事情尽可能的扩展,我必须诉诸于以下几点:
@H_404_4@foo : function() { mp.doCallbacks('foo_before'); // do actual stuff,maybe some hookpoints in between mp.doCallbacks('foo_after'); }我的应用程序中的每个功能都必须像这样开始和结束.这似乎不正确.
那么,JS向导的SO是什么呢?
解决方法
您可以编写一个将另一个函数作为参数的函数,并返回一个新函数,该函数调用该参数的钩子.例如:
@H_404_4@function withCallbacks(name,func)
{
return function() {
mp.doCallbacks(name + "_before");
func();
mp.doCallbacks(name + "_after");
};
}
那么你可以写下如下:
@H_404_4@foo: withCallbacks("foo",function() { // Do actual stuff,maybe some hookpoints in between. })