foreach中的Javascript setTimeout:需要帮助创建闭包吗

foreach中的Javascript setTimeout:需要帮助创建闭包吗,javascript,closures,settimeout,Javascript,Closures,Settimeout,我有这个功能 notes.forEach(function(note) { setTimeout(function() { playNote(note); }, 1000); }); 这不管用。它会同时播放所有音符,而不是在两个音符之间间隔1秒按顺序播放。看来我需要在这里结束这一切。有人能帮我修复这个功能,让它播放每个音符之间的延迟吗?因为所有超时都是在同一时间设置的 这样做: playAllNotes(0); function playAl

我有这个功能

notes.forEach(function(note) {          
    setTimeout(function() {
        playNote(note);
    }, 1000);
});

这不管用。它会同时播放所有音符,而不是在两个音符之间间隔1秒按顺序播放。看来我需要在这里结束这一切。有人能帮我修复这个功能,让它播放每个音符之间的延迟吗?

因为所有超时都是在同一时间设置的

这样做:

playAllNotes(0);
function playAllNotes(index) {
    if(notes.length > index) {
        setTimeout(function() {
            playNote(notes[index]);
            playAllNotes(++index);
        }, 1000);
    }
}

有两种方法可以做到这一点:

1) 具有每秒捕获一个音符直到没有更多音符的功能:

var interval = setInterval(function() {
  playNote(notes.shift()); // changes the notes array!
  if (!notes.length) clearInterval(interval);
}, 1000);
2) 以不同延迟同时启动所有计时器:

notes.forEach(function(note, index) {
  setTimeout(playNote.bind(null, note), index*1000);
});

您可以使用计数器,这很棘手,但如果您正在处理对象,则值得:

counter = 0;
$.each(object, function(index,item){
  counter++;
  var localCounter = counter;
  setTimeout(function{
   console.log('something')
  }, counter * 1000) // change one to number of milliseconds you need
})

第一个计数器是全局的,所以如果我们不使用user
var localCounter
,我们将同时执行所有超时

问题…这是可行的,但如果我在playNote()中添加任何其他操作,则不会。例如,如果我在playnote()之前添加class('playing'),在playnote()之后添加removeClass('playing'),它将播放所有的音符,但添加/删除类只会第一次出现。它在调试器中工作…有什么想法吗?你从什么中删除了类“playing”?我没有任何代码来理解这个sry。没关系,它显示和隐藏css的速度非常快,以便于人眼察觉,所以我在setTimeout中也添加了这一点,现在一切都好了。再次感谢您的帮助。聪明有趣的解决方案。