多次在另一个javascript函数中调用javascript函数

时间:2012-09-13 03:12:19

标签: javascript for-loop settimeout

我有一个javascript函数,效果很好:

function playMp3(str) {
  ...
}

另一个脚本:

function playMp3wholepage() {
  var dgs=new Array();
  dgs[0] = "/abc.mp3";
  dgs[1] = "/dac.mp3";
  dgs[2] = "/hf.mp3";
  ....
  dgs[28] = "/er23.mp3";
  dgs[29] = "/read/34_15.mp3";
  for (i=0;i<=29;i++){
    ses = dgs[i]
    setTimeout("playMp3(ses);", 2000)
  }
}

我想按照第二个脚本中给出的顺序播放所有声音。但我无法运行第二个脚本,只播放最后一个声音(dgs [29]),而不是所有声音。

谢谢

3 个答案:

答案 0 :(得分:1)

当setTimeout回调执行时,sec已经是dgs[29],您需要创建另一个函数范围来保存该值。

for (var i=0; i<=dgs.length; i++){
   (function (i) {
       setTimeout(function() {
           playMp3(dgs[i]);
       }, 2000 * i);
   }(i));
}

答案 1 :(得分:0)

我猜测正在发生的事情是你的循环完成得如此之快,以至于所有对playMp3的调用都是基本上被调用的。但是,对setTimeout的最后一次调用会设置播放的最后一个声音,这就是你听到的所有声音。

此外,使用长度或数组,并使代码灵活:

for(var i=0; i<dgs.length; i++) {      
}

答案 2 :(得分:0)

这是关闭的事情。您可以了解更多here

function playMp3wholepage() {
   var dgs=new Array();
   dgs[0] = "/abc.mp3";
   dgs[1] = "/dac.mp3";
   dgs[2] = "/hf.mp3";
   for (i=0;i<dgs.length;i++){
       ses = dgs[i];
       (function(mp3) {
           setTimeout(function() {
               playMp3(mp3);
           }, 2000);
       })(ses);
   }
}