我有一个回调很多被抛出。我无法想办法让它完成所有功能。
function a(callback) {
callback();
}
var number = 0;
function b(callback) {
number++;
c(number, callback);
}
function c(number, callback) {
if (number != 2) {
a(function () {
b();
});
} else {
callback();
}
}
a(function() {
b(function() {
console.log('hi');
});
});
当我调用console.log
函数时,我需要一种方法来获取最外层回调(带有a()
的回调)到b()
函数以及随后的a()
函数c()
函数。
让我知道这听起来像是胡言乱语。我会尽力澄清。
答案 0 :(得分:0)
您遇到了TypeError: undefined is not a function
。这是因为在c
中您调用了b
而未传递任何参数,因此number !== 2
您丢失了参考资料
我重新编写了你的代码并最终正常工作
var number = 0;
function invoke(fn) { // do you really need this? just invoke directly
fn();
}
function count(fn) {
++number;
limit(number, fn);
}
function limit(num, fn) {
if (num < 2) // this is much safer
invoke(function () {
count(fn); // passing an arg here
});
else
fn();
}
invoke(function () {
count(function () {
console.log('hello world');
});
});
答案 1 :(得分:0)
你已经危险地接近所谓的回调地狱&#39;。如果可以的话,你会想要避免这种情况。由于我不能100%确定您需要传递如此多的回调函数,因此您可以通过执行以下操作来实现您正在寻找的内容:
function increment(number, callback, callback2) {
console.log('Incrementing number ' + number + ' by 1');
number++;
callback(number, increment, callback2);
}
function verify(number, callback, callback2) {
if (number < 2) {
callback(number, verify, callback2);
} else {
callback2();
}
}
var number = 0;
increment(number, verify, function () {
console.log('Hello world!');
});
您会注意到我重命名了一些函数并排除了您的a()函数,因为它只执行传递给它的回调函数。除非该功能是为了另一个目的,否则它是无用的。每次传递回调时,您也不需要创建匿名函数。要将先前定义的函数作为参数或回调传递,只需传递函数名称而不使用()。如果要将未定义的函数作为回调传递,则需要创建匿名函数,这是使用console.log()回调完成的。
这是一个小伙伴。您可以打开控制台日志,看看它在做什么。
还请务必阅读回调地狱以及如何以可避免的方式设计代码。 Call back hell