jQuery陷入无限循环

时间:2015-03-23 19:59:44

标签: jquery

我有一个带有音频播放器的网站,我正在尝试通过添加一个选项来改善随机选项,该选项允许用户更改需要播放的最小音乐数量,以便获得相同的音乐再次选择

基本上是这样的: 歌曲N°15 - >至少X首不同的歌曲 - >歌曲N°15

您可以使用滑块

更改X.

这是我目前的代码:

var Song = 1;
var tweenSongs = 3;
var songList = [];
var songListNumber = 1;

function randomizeTrack() {
    Song = Math.floor((Math.random() * songTotal) + 1);

    if (songListNumber - tweenSongs < 1) {
        for (i=0; i <= tweenSongs - 1; i++) {
            if (Song == songList[songListNumber - i]) {
                randomizeTrack()
            }
        }
    }
    else {
        for (i=0; songListNumber != 0; i++) {
            if (Song == songList[songListNumber - i]) {
                randomizeTrack()
            }
        }
    }

    songList[songListNumber] = Song;
    songListNumber++;
}

问题:

在第三首歌之后,网页冻结,我需要重新启动它,所以那里有一个无限循环,但是我把自己与自己的代码混淆了,有没有人知道是什么导致了这个无限循环。

here's a link to the website with the problem

2 个答案:

答案 0 :(得分:1)

else情况下你正在检查songListNumber不是0,并且在一首歌之后它再也不是0,所以循环是无限的。

我会删除递归,只需在单个循环中检查“太近”。只需检查列表的末尾,确保在检查完整个列表后停止,或超过tweenSongs的数量

function randomizeTrack() {

    var tooRecent = false;

    do
    {
        Song = Math.floor((Math.random() * songTotal) + 1);

        tooRecent = false;
        for (var i=0; i < tweenSongs && i < songListNumber; i++)
        {
            if (songList[songListNumber - 1 - i] == Song)
            {
                // we can stop searching
                tooRecent = true;
                break;
            }
        }

    }
    while (tooRecent);

    songList[songListNumber] = Song;
    songListNumber++;
}

我认为您还需要将songListNumber初始化为0而不是1。第一次通过你设置最初为空的数组的第二个元素并跳过songList[0]

答案 1 :(得分:0)

function inArray(needle, haystack) {
    var length = haystack.length;
    for(var i = 0; i < length; i++) {
        if(haystack[i] == needle) return true;
    }
    return false;
}

var Song = 1;
var tweenSongs = 10;
var songList = [];
var songListNumber = 1;

while(songList.length<=tweenSongs){

 Song = Math.floor((Math.random() * tweenSongs) + 1);
    if(!inArray(Song,songList)){
        songList[songListNumber]=Song;
        songListNumber++
                 }

}

console.log(songList);