在循环中调用 setTimeout 未按预期工作
Calling setTimeout in a loop not working as expected
下面的JavaScript应该(在我看来)间隔0.5秒播放一系列音符。但它将它们全部作为单个同时和弦演奏。知道如何解决它吗?
function playRecording() {
if (notes.length > 0) {
for (var i = 0; i < notes.length; i++) {
var timeToStartNote = 500 * i;
setTimeout(playNote(i), timeToStartNote);
}
}
}
function playNote(i) {
var noteNumber = notes[i];
var note = new Audio("/notes/note_" + noteNumber + ".mp3");
note.play();
}
JavaScript 闭包,将其包装在一个自执行函数中:
for (var i = 0; i < notes.length; i++) {
(function(i) {
var timeToStartNote = 500 * i;
setTimeout(function() {
playNote(i)
}, timeToStartNote);
})(i)
}
谢谢大家,这是我问题的完整解决方案:
function playRecording() {
if (notes.length > 0) {
for (var i = 0; i < notes.length; i++) {
playNote(i);
}
}
}
function playNote(i) {
setTimeout(function () {
var noteNumber = notes[i];
var note = new Audio("/notes/note_" + noteNumber + ".mp3");
note.play();
}, 500 * i);
}
实际上非常简单,在 for 循环中,您调用函数 playNote(i)
它立即播放音符 i(因此像和弦一样立即演奏许多音符,因为它处于非常快速运行的 for 循环中)。相反,您应该尝试编写代码,让超时实际播放音符。setTimeout
函数需要该函数作为参数,而不是您调用该函数。
(function(j){setTimeout(function(){playNote(j);},j*500);}(i));
相关文章:
- 刷新后,setTimeout将工作或不工作
- 使setInterval和setTimeout工作时出现问题
- 为什么我需要在setTimeout中有匿名函数才能使此代码工作
- window.open没有't在设置setTimeout内工作-弹出窗口被阻止
- 如何使setTimeout脚本在html表单中正常工作
- SetTimeout延迟未按jquery幻灯片中的预期工作
- setTimeout()在JavaScript中是如何工作的
- Javascript-为什么不是't此setTimeout函数正在工作
- setInterval工作setTimeout不工作;t
- setTimeout未按要求工作
- 为什么javascript setTimeout()不能在循环中工作
- setTimeout方法的工作原理很奇怪
- 变量在Javascript中是如何工作的?可以在setTimeout期间更改变量值
- Javascript:addEventListener 仅在 setTimeout 中工作
- 如何删除 settimeOut 的队列工作
- 在工作线程中使用 setTimeOut
- 无法在 javascript 中获取 setTimeout 以正常工作
- 在循环中调用 setTimeout 未按预期工作
- setTimeout() 如何在 JS 上工作
- JavaScript代码首先使用setTimeout工作,但随后崩溃或不起作用