Полезна ли рекурсия в этом случае? (javascript/узел.js)

Я пытаюсь сделать телевизор из raspberry pi, в javascript, типа, который снова и снова проигрывает один и тот же плейлист. Воспроизведение файлов не проблема, но я застрял в асинхронной части javascript. Вот код, который меня беспокоит:

function play (file)
{
    exec('home/pi/play.sh', [file], function (error, stdout, stderr){
        if (PIndice != Playlist.length-1){
            PIndice=PIndice+1;
        }else{
            PIndice=0;
        }
        play(Playlist[PIndice]);
});

Другая функция вызывает его с Playlist[0], когда я уверен, что в нем есть путь.

Мой вопрос: это безопасно? Разве рекурсия не убьет процессор? Я думал об использовании setTimeOut, но не нашел способа получить продолжительность видео.

Я пытался вызвать воспроизведение в цикле, но мне просто удалось воспроизвести весь плейлист за одно и то же время.

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

РЕДАКТИРОВАТЬ: все файлы в формате MPEG4, список воспроизведения - это просто массив строк, который содержит путь к видеофайлу для воспроизведения. Он должен воспроизводиться без интернета, поэтому браузера нет, и я не могу использовать html-запрос, чтобы получить метаданные видео, чтобы получить его продолжительность.

EDIT2: я забыл сказать, что play.sh просто запускает проигрыватель, если нет другого его экземпляра, это просто остаток от предыдущей версии, где я не знал об обратном вызове execFile.


person DrakaSAN    schedule 24.07.2013    source источник
comment
Немного больше деталей было бы полезно. Какой тип файла вы воспроизводите? Это в браузере? Какой тип плейлиста вы имеете в виду?   -  person Dave Swersky    schedule 24.07.2013
comment
Список воспроизведения - это просто массив строк, который представляет собой путь к файлу для воспроизведения, все файлы в формате MPEG4. Я не пользуюсь никаким браузером, все файлы уже на RPi   -  person DrakaSAN    schedule 24.07.2013


Ответы (1)


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

При этом обратный вызов exec вызывается после завершения дочернего процесса. Поскольку play.sh просто запускает проигрыватель, похоже, что он завершится до того, как файл будет воспроизведен, что означает, что воспроизведение будет вызываться несколько раз до завершения первой дорожки. Код, который у вас есть, будет работать лучше всего, если вы exec будете вызывать что-то, что работает в течение всего трека, а затем завершается. Это должно правильно настроить вас на воспроизведение следующего трека после завершения каждого из них.

Если по какой-то причине вы не можете продолжать процесс до тех пор, пока дорожка не будет завершена, вам придется спроектировать файл play.sh так, чтобы его можно было вызывать несколько раз и возвращать статус текущей дорожки. Что-то типа:

function play (file)
{
    exec('home/pi/play.sh', [file], function (error, stdout, stderr){
        if(stdout == 'done') {
            if (PIndice != Playlist.length-1){
                PIndice=PIndice+1;
            } else {
                PIndice = 0;
            }
        }

        play(Playlist[PIndice]);
    });
};

Таким образом, PIndice увеличивается только после завершения воспроизведения файла, а затем он может начать следующую дорожку.

person Timothy Strimple    schedule 25.07.2013
comment
Четкий, точный и лаконичный ответ, большое спасибо. У меня есть stdout в play.sh, но я не думал использовать его таким образом, так как я никогда не видел, чтобы два файла воспроизводились вместе во всем моем тесте, но мы никогда не были слишком осторожны, верно? - person DrakaSAN; 25.07.2013