我编写了一个回调助手,它允许我将多个回调组合成一个函数变量:
function chainCallbacks() {
var callbacks = arguments;
return function () {
for(var i = 0; i < callbacks.length; i++) {
if(callbacks[i] != null) {
callbacks[i].apply(null, arguments);
}
}
};
}
这有效,但我想知道是否有任何javascript库提供相同的功能?甚至更好,模拟.NET“事件”模式的东西?
myEvent+=myCallback;
答案 0 :(得分:2)
我修改了你的chainCallbacks函数。您可以在JS控制台中测试以下代码(我正在使用Chrome -works),并检查结果。
var result = 0;
function a() {
result += 5;
console.log(result);
_next();
}
function b() {
result += 10;
console.log(result);
_next();
}
function c() {
result += 20;
console.log(result);
_next();
}
function chainCallbacks() {
var _this = this;
var _counter = 0;
var _callbacks = arguments;
var _next = function() {
_counter++;
if(_counter < _callbacks.length) {
_callbacks[_counter].apply(_this);
}
};
_this._next = _next;
return function() {
if(_callbacks.length > 0) {
_callbacks[0].apply(_this);
}
};
}
var queue = chainCallbacks(a, b, c);
queue();
想法很简单 - 只要你的回调函数执行完毕,你就会调用_next()
,并且你想跳转到另一个。因此,您可以致电_next()
,例如在一些jQuery动画之后,这样你将保留函数的顺序。
答案 1 :(得分:1)
如果你想用一个回调调用原始回调和其他回调的回调,我可能会做这样的事情:
Requirejs.config.callback = function(orig) {
var fns = [orig, first, second, third];
return function() {
fns.forEach(function(fn) { fn.apply(null, this); }, arguments);
};
}(Requirejs.config.callback);
但如果你经常这样做,我认为你的解决方案将会得到很好的解决方案。我认为不需要图书馆。
Requirejs.config.callback = chainCallbacks(Requirejs.config.callback, first, second, third)
库无法在JavaScript中扩展语言语法。它仅限于可用的内容......没有操作员超载或任何东西。