2017-06-17 62 views
0

下面的代碼以遞歸方式播放音頻元素並跟蹤對文本的迭代,這兩者都通過清除其超時的按鈕停止。SetTimeout遞歸(Javascript)

如果將playTimeout分配給外部函數nextThing,則單擊停止按鈕後,音頻將在文本迭代停止後再播放一次。然而,在playTimeout的評論(內部)版本中,音頻立即停止。

問題:a)爲什麼會發生這種情況?和b)我怎樣才能恰當地說出這樣的迭代和音頻一起移動?

function nextThing(millis,pitch){ 
    setTimeout(playTone,millis,pitch); 
}; 
function timedCount(millis){ 
    document.getElementById('txt').value=iteration; 
    playTimeout=nextThing(millis,"C3");  
// playTimeout=setTimeout(playTone,millis,"C3") 
    doRecursion=setTimeout(function(){timedCount(millis)},millis);  
    iteration++; 
    console.log("made it"); 
} 

回答

2

nextThing功能沒有返回任何東西,計時器ID被忽略,它將會分配給undefinedplayTimeout

function nextThing(millis, pitch) { 
    return setTimeout(playTone, millis, pitch); 
// ^^^^^^ 
} 
+0

啊哈!因此,由於沒有實際的ID值來清除超時時間,所以即將發生的音頻超時按計劃發生,即使相應的遞歸被破壞,因此不再被調用。 –