3

我写了一个回调助手,它可以让我将多个回调分组到一个函数变量中:

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;
4

2 回答 2

2

我已经修改了你的 chainCallbacks 函数。您可以在 JS 控制台中测试以下代码(我正在使用 Chrome - 工作正常),并检查结果。

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()只要你的回调函数完成执行,你就调用它,并且你想跳转到另一个。所以你也可以在一些 jQuery 动画之后调用_next()eg,这样你就可以保持函数的顺序。

于 2013-04-23T03:07:39.480 回答
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 中的语言语法。它仅限于可用的......没有运算符重载或任何东西。

于 2013-04-23T02:29:05.117 回答