我正在尝试编写一个递归函数,该函数将以固定长度 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);
(大概)八个音频文件全部一次播放。
有人知道出什么问题了吗?这是一个简单的错误,还是我完全以错误的方式来完成这样的任务?
感谢您的帮助
答案 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);