के साथ प्रोग्रामेटिक रूप से कॉलबैक लागू करना तो, मैं एक वेब ऐप लिख रहा हूं। बहुत कुछ सब कुछ क्लाइंट-साइड किया जाता है, सर्वर एक रीस्टफुल इंटरफ़ेस है। मैं अपनी पसंद के ढांचे के रूप में jQuery का उपयोग कर रहा हूं और Revealing Module Pattern में अपना कोड कार्यान्वित कर रहा हूं। ,जेएस/jQuery
(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);
सुंदर सीधा सही:
मेरी कोड के wireframe मूल रूप से इस तरह दिखता है?
अब, हम अंदर से और साथ ही एप्लिकेशन स्कोप के बाहर से (एकाधिक, पदानुक्रमित) कॉलबैक पंजीकृत करने में सक्षम हैं।
मुझे क्या गुस्सा दिलाना है:
foo : function() {
mp.doCallbacks('foo_before');
// do actual stuff, maybe some hookpoints in between
mp.doCallbacks('foo_after');
}
मेरे ऐप के अंदर हर एक समारोह प्रारंभ और समाप्ति करने के लिए होगा: पूरी बात संभव के रूप में विस्तृत बनाने के लिए, मैं इन पंक्तियों के साथ कुछ का सहारा लेना होगा उसके जैसा। यह सिर्फ सही प्रतीत नहीं होता है।
तो, एसएस के जेएस जादूगर - क्या करते हैं?
लगभग हर प्लगइन वास्तुकला मैं कार्यान्वित देखा गया है से पहले करने के लिए और हुक के बाद सहारा लिया:
यहाँ एक उदाहरण कोड है। जब तक मैं कह सकता हूं, ज्यादातर समय आप केवल उन लोगों को लागू करते हैं जो लोग इसके लिए पूछते हैं। कोई जादू समाधान जो मुझे पता है। –
यह ओवर-इंजीनियरिंग के मामले की तरह लगता है। कॉलबैक से पहले और बाद में समर्थन करने के लिए क्या आपको वास्तव में अपनी लाइब्रेरी में प्रत्येक _internal_ फ़ंक्शन की आवश्यकता है? रेल एक विशाल कॉलबैक सैंडविच की तरह है, और फिर भी, रेल में केवल 1% विधियों का समर्थन कॉलबैक है। और, जहां वे समर्थन कॉलबैक करते हैं, वे वैसे ही करते हैं जैसा आपने अपने उदाहरण _foo_ फ़ंक्शन में उल्लिखित किया है। –