Javascript 如何在具有不同超时长度的循环中使用setTimeout? var playlist=[ ['Message 1','1000'], ['Message 2','6000'], ['Message 3','1000'], ['Message 4','8000'] ]; 对于(i=0;i

Javascript 如何在具有不同超时长度的循环中使用setTimeout? var playlist=[ ['Message 1','1000'], ['Message 2','6000'], ['Message 3','1000'], ['Message 4','8000'] ]; 对于(i=0;i,javascript,settimeout,Javascript,Settimeout,”+playlist[x][0]+”超时:“+playlist[x][1]+””; }}(i),播放列表[i][1]*i) } 我试图创建一个计时器,其中每个setTimeout间隔的长度根据存储在数组中的变量而变化。例如,我希望“Message 1”显示1秒,然后“Message 2”显示6秒,依此类推 但是,消息以意外的顺序出现,并且它们在屏幕上的时间段似乎与我在数组中指定的相应延迟无关 理想情况下,我还希望该进程在到达数组的末尾时循环回数组的开头 任何帮助都将不胜感激 编辑:带循

”+playlist[x][0]+”超时:“+playlist[x][1]+”

”; }}(i),播放列表[i][1]*i) } 我试图创建一个计时器,其中每个setTimeout间隔的长度根据存储在数组中的变量而变化。例如,我希望“Message 1”显示1秒,然后“Message 2”显示6秒,依此类推

但是,消息以意外的顺序出现,并且它们在屏幕上的时间段似乎与我在数组中指定的相应延迟无关

理想情况下,我还希望该进程在到达数组的末尾时循环回数组的开头


任何帮助都将不胜感激

编辑:带循环条件:

var playlist = [    
        ['Message 1','1000'],
        ['Message 2','6000'],
        ['Message 3','1000'],
        ['Message 4','8000']
    ];
    for (i = 0; i < playlist.length; i++) {
       setTimeout((function(x) { return function() { 
          $("content").empty().append("<p>" + playlist[x][0] + " timeout: " + playlist[x][1] + "</p>");
       }; })(i), playlist[i][1]*i)
    }   
然后,要停止循环,可以调用:

var timer = null;
var index = -1;
var playlist = [
    { message: "Message 1", duration: 1000 },
    { message: "Message 2", duration: 6000 },
    { message: "Message 3", duration: 1000 },
    { message: "Message 4", duration: 8000 }
];

function displayNextMessage() {

    // If the next message exists...
    if (playlist[++index]) {

        // ...do something with the message here...
        console.log(playlist[index].message);

        // ...and queue the next message.
        timer = setTimeout(function () {
            displayNextMessage();
        }, playlist[index].duration);
    }

    // Otherwise, loop back to the beginning.
    else {
        index = -1;
        displayNextMessage();
    }
}

displayNextMessage();

当当前超时过期时,您需要设置下一个超时,而不是在这样的循环中array@Will:我已更新我的答案,以包括循环条件和“停止”机制。
clearTimeout(timer);