Случайный, shuffle JavaScript плейлист

Я знаю, что об этом спрашивали раньше, но я новичок в JavaScript, и после прочтения других ответов я не могу понять, почему мой метод не работает. Первый трек, который играет является случайным, но затем, когда песня заканчивается, тот же трек повторяется снова и снова, вместо того, чтобы выбрать другой случайный трек. Если аудио.воспроизведение выбирает случайный трек в первый раз, почему он не выбирает случайный трек снова, когда песня заканчивается, но вместо этого петляет тот же трек? Помощь ценится:

var audio_files = [
"TRACKS/1.mp3",
"TRACKS/2.mp3",
"TRACKS/3.mp3"
]

var random_file = audio_files[Math.floor(Math.random() * audio_files.length)];

var audio = new Audio(random_file);

audio.play();

audio.addEventListener('ended', function(){
audio.play();
}

3 ответа

  1. Ваш код должен быть таким:

    var audio_files = [
    "TRACKS/1.mp3",
    "TRACKS/2.mp3",
    "TRACKS/3.mp3"
    ]
    
    function random_file(){
      return audio_files[Math.floor(Math.random() * audio_files.length)];
    }
    
    var audio = new Audio( random_file() );
    
    audio.play();
    
    audio.addEventListener('ended', function(){
      audio.play( random_file() );
    }
    

    Ваш listner может быть таким, если у игрока есть другой способ указать файл для существующего плательщика

    audio.addEventListener('ended', function(){
      audio.src = random_file();
      audio.play();
    }
    

    или если у вашего игрока нет такого метода api, единственный способ —

    function listner() {
      audio = new Audio( random_file() );
      audio.play();
      audio.addEventListener('ended', listner)
    }
    
    audio.addEventListener('ended', listner)
    
  2. Просто установите известный модуль underscoreJS на стороне клиента или сервера с Node.js и вызвать пример функции;

    var random_file = _.sample(audio_files);
    
  3. Было бы проще перетасовать массив и просто перебирать по нему, чтобы получить каждый файл. С помощью этого решения вы не получите один и тот же файл дважды из-за случайного решения.

    Как только Вы дойдете до конца, сделайте то же самое, перетасуйте массив и повторите еще раз. Таким образом, список изменится, создавая впечатление, что выбор другого файла случайным образом (но на самом деле просто повторяется).

    Вот псевдо-код к нему

    function readFiles(){        
        array = shuffle(array);
        for(var i = 0; i < array.length; ++i){
             play(array[i]);
        }
        readFiles(); //to read undefinitly
    }
    

    Здесь и здесь вы найдете отличные темы для перетасовки массива. Я не буду делать это снова, просто следовать ответу там.

    В вашем случае вы не хотите цикл, но вы будете использовать счетчик получить следующий файл и перетасовать массив снова, как только вы получите до конца

    function getNextFile(){
        if(currentFile >= array.length){ //reach the end
            shuffle(array);
            currentFile = 0;
        } 
        return array[currentFile+];
    }