很难处理回调

Having a hard time with callbacks

了解回调和此问题的解决方案让我望而却步。 它应该每秒打印一个数字,倒计时直到零。目前,它记录从 10 到 0 的数字,但一次记录所有数字,并在无限循环中继续。

请帮助我更好地了解这种情况。我已经阅读了有关回调的内容并且有一个概念性的理解,但执行起来仍然有点棘手。

var seconds = 0;

var countDown = function(){
    for(var cnt = 10; cnt > 0; cnt--){
        setTimeout(function(x){
            return function(){
                seconds++
                console.log(x);
            };
        }(cnt), seconds * 1000);
    }
}
countDown()

继续阅读 IIFEs 了解它们的工作原理。在这种情况下,您正在创建要打印的值的闭包。你的想法是对的,但你的语法不对。

var seconds = 0;

var countDown = function () {
    var cnt = 10;

    // simplify your loop
    while (cnt--) {

        // setTimeout expects a function
        // use an IIFE to capture the current value to log
        setTimeout((function (x) {

            // return the function that setTimeout will execute
            return function (){
                console.log(x + 1);
            };
        }(cnt)), (++seconds) * 1000);
    }
};
countDown();

您的代码现在的工作方式是,它执行一个 for 循环,其中 cnt 从 10 到 1。这有效。在每次迭代中,它都会在 seconds * 1000 毫秒内安排一个新函数成为 运行,每次都仔细并适当地将 cnt 的值隔离在 x 中。问题是 seconds0,并且只有在回调执行后才会改变;但是当回调执行时,所有这些都已经被安排执行。如果你需要 seconds * 1000 在你仍然安排它们时变化(而 for 循环仍然是 运行ning),你需要在循环中更改 seconds,而不是在其中一个回调中。