我有一个基本的小部件,我可以将函数调用推送到(几乎像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);
});
但我无法让它发挥作用,任何想法如何实现这一点?
答案 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数组正在做的事情。