保持回调活着

时间:2015-04-21 02:12:18

标签: javascript node.js function callback

我有一个回调很多被抛出。我无法想办法让它完成所有功能。

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()函数。

让我知道这听起来像是胡言乱语。我会尽力澄清。

2 个答案:

答案 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()回调完成的。

这是一个小伙伴。您可以打开控制台日志,看看它在做什么。

jsfiddle

还请务必阅读回调地狱以及如何以可避免的方式设计代码。 Call back hell