我如何处理多个回调?现在只有我注册的第一个被解雇..
这是我当前处理回调的代码(此代码正在加载异步)
var widget = function () {
var onNameCallback,
onTriggedCallback;
function getName(callback) {
onNameCallback = callback;
}
function onTrigg(callback) {
onTriggedCallback = callback;
}
/** lots of code ... **/
if(typeof onNameCallback == 'function') {
// Fire the callback
onNameCallback('1');
}
if(typeof onTriggedCallback == 'function') {
// Fire the callback
onTriggedCallback('hello');
}
/** lots of code ... **/
return {
getName:getName,
onTrigg:onTrigg,
};
}();
if (window._test) {
for (var i = 0; i < _test.length; i++) {
var method = _test.shift();
try {
widget[method].apply(widget, _test);
} catch (err) {
console.log(err);
}
var method = _test.shift();
}
};
以下是我如何注册它们:
_test.push('getName', function(data) {
console.log(data);
});
_test.push('onTrigg', function(data) {
console.log(data);
});
但由于某些原因,只有getName
被解雇..
有什么想法吗?
答案 0 :(得分:1)
代码的主要问题是,当您从数组中移动项目时,您正在计算i
,以便数组的长度变小。您将循环遍历数组中的一半项目。而只是循环,而数组中还有任何东西。
此外,当您使用apply
调用方法并将数组中的所有剩余项目作为参数发送时,您将从数组中移除方法名称两次并忽略一个(实际上是处理程序)。这实际上并没有阻止代码工作,但很难遵循它实际想要完成的任务。从数组中移出两个值,并使用call
方法使用单个参数调用该方法。
if (window._test) {
while (_test.length > 0) {
var method = _test.shift();
var handler = _test.shift();
try {
widget[method].call(widget, handler);
} catch (err) {
console.log(err);
}
}
}
如果你想在数组中进行每个回调,只需将其从_test
数组中移出:
if (window._test) {
while (_test.length > 0) {
var callback = _test.shift();
try {
widget[callback[0]].call(widget, callback[1]);
} catch (err) {
console.log(err);
}
}
}
答案 1 :(得分:0)
我将回调添加到数组中,如:
_test.push(['getName', function(data) {
console.log(data);
}]);
_test.push(['onTrigg', function(data) {
console.log(data);
}]);
并修改:
if (window._test) {
for (var i = 0; i < _test.length; i++) {
var method = _test[i].shift();
try {
widget[method].apply(widget, _test[i]);
} catch (err) {
console.log(err);
}
}
};
现在很棒!
感谢FelixKling!