推送函数并获取回调

Push functions and get callback

本文关键字:获取 回调 函数      更新时间:2023-09-26

我有一个基本的小部件,我可以将函数调用推送到(几乎像Google analytics,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);
});

但我无法让它发挥作用,有什么想法可以实现吗?

您应该更改

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

var method = args.shift();

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

这是一些非常棒的janky代码,你可以在那里实现你想要做的事情。回调的一个常见做法是在你传递回调的函数中使用arguments.length-1],所以它总是"最后"个参数,将用作回调函数。然后你说

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

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

我想你真正想要的是Widget类成为它自己的东西,并且有一个WidgetManager类或Widgets类,然后它将做与你的_test数组类似的事情。