Por lo tanto, estoy escribiendo una aplicación web. Casi todo se hace en el lado del cliente, el servidor no es más que una interfaz REST. Estoy utilizando jQuery como mi marco de trabajo de elección e implementando mi código en un Revealing Module Pattern.Implementando de forma programada devoluciones de llamada con JS/jQuery
La estructura metálica de mi código, básicamente, tiene el siguiente aspecto:
(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);
Bastante sencillo, ¿verdad?
Ahora, podemos registrar (múltiples, jerárquicas) devoluciones de llamada desde dentro y fuera del alcance de la aplicación.
Lo que me está molestando: Para hacer que todo sea tan extensible como sea posible, tendría que recurrir a algo como lo siguiente:
foo : function() {
mp.doCallbacks('foo_before');
// do actual stuff, maybe some hookpoints in between
mp.doCallbacks('foo_after');
}
cada función dentro de mi aplicación tendría que empezar y terminar como eso. Esto simplemente no parece correcto.
Entonces, JS wizards of SO - what do?
Casi cada arquitectura de plugin que he visto ejecutando ha recurrido a antes y después de ganchos. La mayor parte del tiempo, solo implementas lo que las personas piden mientras lo piden, hasta donde yo sé. Ninguna solución mágica que yo sepa. –
Esto parece un caso de exceso de ingeniería. ¿Realmente necesita todas las funciones _internal_ en su biblioteca para admitir devoluciones de llamada antes y después? Rails es como un sándwich de devolución de llamada gigante, y aun así, solo el 1% de los métodos en Rails admiten callbacks. Y, cuando admiten callbacks, lo hacen exactamente como lo ha descrito en su ejemplo _foo_ function. –