Javascript:使用setTimeout延迟递归

时间:2019-01-15 23:38:30

标签: javascript recursion settimeout

我正在尝试编写一个递归函数,该函数将以固定长度 n 的随机字母序列作为音频输出,该长度是该函数的唯一参数。

我的想法是让该函数输出随机字母的音频,然后等待给定的时间(使用setTimeout),然后再使用参数 n-1 调用自身(延迟是必要的,因此每个音频文件可以在下一次播放之前完成播放)。

但是,当我运行代码时,setTimeout似乎被忽略了,因为所有音频文件都立即播放。

相关代码:

function sayLetter(n)
{
    if (n > 0)
    {
        r = Math.floor(Math.random()*26); //Chooses random index
        sound[r].play(); 
        setTimeout(sayLetter(n-1), 1000); 
    }
}

当我在程序中的其他位置调用该函数时:

sayLetter(8);

(大概)八个音频文件全部一次播放。

有人知道出什么问题了吗?这是一个简单的错误,还是我完全以错误的方式来完成这样的任务?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您正在立即调用该函数,而不是在setTimeout的回调中调用它。

function sayLetter(n)
{
    if (n > 0)
    {
        console.log(n)
        setTimeout(() => {
          sayLetter(n-1)
        }, 1000); 
    }
}

sayLetter(3);

答案 1 :(得分:-1)

我通过将setTimeout从以下位置切换来解决了该问题

setTimeout(sayLetter(n-1), 1000);

setTimeout(function() { sayLetter(n-1), }, 1000);