Vì vậy, tôi đang viết một ứng dụng web. Khá nhiều thứ được thực hiện phía máy khách, máy chủ là giao diện RESTful. Tôi đang sử dụng jQuery làm khung lựa chọn của mình và triển khai mã của tôi trong một số Revealing Module Pattern.Thực hiện các cuộc gọi lại theo lập trình bằng JS/jQuery
Các wireframe của mã của tôi về cơ bản trông như thế này:
(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);
Khá đơn giản, phải không?
Bây giờ, chúng tôi có thể đăng ký (nhiều, phân cấp) cuộc gọi lại từ bên trong cũng như từ bên ngoài phạm vi ứng dụng.
gì được bugging tôi: Để làm cho toàn bộ điều như mở rộng càng tốt, tôi sẽ phải dùng đến một cái gì đó dọc theo những dòng:
foo : function() {
mp.doCallbacks('foo_before');
// do actual stuff, maybe some hookpoints in between
mp.doCallbacks('foo_after');
}
Mỗi chức năng duy nhất bên trong ứng dụng của tôi sẽ phải bắt đầu và kết thúc như thế. Điều này dường như không đúng.
Vì vậy, thuật sĩ JS của SO - làm gì?
Hầu hết các kiến trúc plugin tôi đã nhìn thấy được thực hiện đã viện đến trước và sau khi móc. Hầu hết thời gian bạn chỉ thực hiện những gì mọi người yêu cầu khi họ yêu cầu, theo như tôi có thể nói. Không có giải pháp ma thuật mà tôi biết. –
Điều này có vẻ giống như một trường hợp quá kỹ thuật. Bạn có thực sự cần mọi chức năng _internal_ trong thư viện của mình để hỗ trợ trước và sau khi gọi lại không? Rails giống như một chiếc bánh sandwich gọi lại khổng lồ, và thậm chí như vậy, chỉ có 1% các phương thức trong Rails hỗ trợ gọi lại. Và, nơi họ hỗ trợ gọi lại, họ thực hiện chính xác như bạn đã nêu trong hàm _foo_ ví dụ của bạn. –