推送功能并获得回调

时间:2013-08-20 11:47:49

标签: javascript

我有一个基本的小部件,我可以将函数调用推送到(几乎像Google分析,ga.js)

这是小部件代码:

var widget = function () {

    function _private_setName(a, callback) {
        console.log(a[0]);

        callback(a[0]);
    }

    return{
       setName:_private_setName
    };  
}();

if (window._test) {
    for (var i = 0; i < _test.length; i++) {
        var method = _test[i].shift();
        try {
            widget[method].apply(widget, _test);
        }
        catch(err) { }
    }
}

window._test = {
    push: function() {
        try {
            var args = Array.prototype.slice.call(arguments, 0);
            var method = args[0].shift();
            widget[method].apply(widget, args);
        }
        catch(err) { }  
    }
};

所以我现在可以做的是:

var _test = _test || [];
_test.push(['setName', 'Todd']);

但是我希望能够从函数setName获得回调。

我试过了:

_test.push('setName', 'Todd', function(num) {
    console.log("callback called! " + num);
});

但我无法让它发挥作用,任何想法如何实现这一点?

2 个答案:

答案 0 :(得分:2)

你应该改变

var method = args[0].shift();

var method = args.shift();

之后将调用回调。这是一个工作版http://jsfiddle.net/krasimir/pLuad/1/

的jsfiddle

答案 1 :(得分:0)

这是一些相当漂亮的janky代码,你已经到达那里以实现你想要做的事情。回调的一个常见做法是在要传递回调函数的函数中使用参数[arguments.length -1],因此它始终是将用作回调函数的“最后”参数。然后你说

if(typeof arguments[arguments.length - 1] === 'function'){
    arguments[arguments.length - 1](dataToPassToCallback);
}

在您的情况下,您似乎正在添加大量不必要的抽象并使其变得比它需要的更加困难。例如,您正在声明一个“窗口小部件”对象/类,然后您将自己的静态实例分配给它(窗口小部件[fnName] = widget.apply()) - 所以现在当您声明更多窗口小部件时,它们都是包含对其他窗口小部件方法的引用。

我想你真正想要的是Widget类是它自己的东西,并且有一个WidgetManager类或一个Widgets类,它将执行类似于你的_test数组正在做的事情。