因此,我正在编写一个Web应用程序。几乎所有事情都是在客户端完成的,服务器不过是一个RESTful接口(interface)。我使用jQuery作为我的选择框架,并在Revealing Module Pattern中实现我的代码。

我的代码的线框基本上看起来像这样:

(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);

很简单,对不对?

现在,我们可以从应用程序范围的内部和外部注册(多个,分层的)回调。

让我烦恼的是:为了使整个事情尽可能地可扩展,我不得不诉诸于以下方面:
foo : function() {
    mp.doCallbacks('foo_before');
    // do actual stuff, maybe some hookpoints in between
    mp.doCallbacks('foo_after');
}

我的应用程序中的每个函数都必须像这样开始和结束。这似乎是不对的。

那么,SO的JS向导-怎么办?

最佳答案

您可以编写一个将另一个函数用作参数的函数,然后返回一个新函数,该函数调用围绕该参数的钩子(Hook)。例如:

function withCallbacks(name, func)
{
    return function() {
        mp.doCallbacks(name + "_before");
        func();
        mp.doCallbacks(name + "_after");
    };
}

然后,您可以编写如下内容:
foo: withCallbacks("foo", function() {
    // Do actual stuff, maybe some hookpoints in between.
})

10-07 17:33