在这种情况下recursion是否好? (JavaScript的/的node.js)

我正尝试用树莓派制作一个电视,用javascript,一次又一次播放相同的播放列表。 播放文件不是问题,但我坚持在javascript的asynchronous部分这里的代码极其困扰我:

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]); }); 

当我确定其中有一个path名时,另一个函数用播放列表[0]调用它。

我的问题是:安全吗? 不会recursion最终会杀死CPU? 我虽然关于使用setTimeOut,但我没有find任何方式来获得video的持续时间。

我已经尝试过在循环中调用播放,但是我只是在同一时间播放整个播放列表。

我不要求一个全function的解决scheme,只是暗示我在哪里可以find一个方法来做到这一点是否有一种方法等待播放结束再次调用之前,即使JavaScript是asynchronous?

编辑:所有的文件在MPEG4,播放列表只是一个string数组,至less包含播放video文件的path名。 它应该没有互联网播放,所以没有浏览器,我不能使用HTML请求,让video的元数据得到它的持续时间。

编辑2:我忘记告诉play.sh只是启动播放器,如果没有其他实例,它只是一个以前的版本,我不知道execFile的callback

这实际上不是一个recursion调用,不会导致堆栈深度的问题。 注意play方法在callback中被调用,而不是在play方法本身内被调用。

这就是说,一旦subprocess终止,就会调用execcallback。 由于play.sh只是启动播放器,所以听起来它会在文件播放完之前终止,这意味着播放将在第一个曲目完成之前被多次调用。 代码如你所拥有的,如果你是exec,将会调用一些在轨道运行的事件,然后终止。 这应该正确地设置你在每个完成后播放下一个音轨。

如果由于某种原因,你不能保持这个过程一直运行,直到轨道完成,你将不得不deviseplay.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只会增加,然后它可以开始下一个轨道。