2012-09-13 5 views
0

나는 자바 스크립트 함수를했고, 그것은 잘 작동 :자바 스크립트 함수를 여러 번

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]) 만 재생합니다.

내가 무슨 일이 일어나고 있는지 추측하고있어

답변

1

, sec 이미 dgs[29]입니다 :

은 또한, 길이 또는 배열을 사용, 유연한 코드를 확인하십시오.

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

아니면'dgs [i]'를'i '대신 함수에 전달하면됩니다 (배열은 문자열 만 보유하고 있으므로 일부 또는 모든 타임 아웃이 실행되기 전에 배열에 대한 변경 사항을 염려 할 필요가 없습니다)). – nnnnnn

0

playMp3에 대한 모든 호출은 한 번에 기본적으로 호출되고 있는지, 루프가 너무 빨리 완료한다는 것입니다 감사합니다. 그러나 setTimeout에 대한 마지막 호출은 재생할 마지막 사운드를 설정했을 것이므로 그게 전부입니다. 당신이 값을 perserve 다른 기능의 범위를 만들어야에서는 setTimeout 콜백이 실행되면

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

당신은 타임 아웃 지연 루프 카운터 곱해야한다는 말이 맞아,하지만 시점 이후에 시간 제한을 실제로 모두가 어떤 설정됩니다 같은'ses' 변수를 참조 실행을 시작할 때 for 루프의 마지막에 있었다 (즉, 마지막 항목). – nnnnnn

+0

네가 맞아. 고마워. 내가 이미 그 문제를 해결하기 위해 여기에 답변을하므로 해당 섹션을 제거했습니다. – Aesthete

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); 
    } 
} 
관련 문제