有没有更好的方法在javascript中进行回调链接?

时间:2013-04-23 02:07:36

标签: javascript callback

我编写了一个回调助手,它允许我将多个回调组合成一个函数变量:

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;

2 个答案:

答案 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中扩展语言语法。它仅限于可用的内容......没有操作员超载或任何东西。