2017-06-17 105 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值来清除超时时间,所以即将发生的音频超时按计划发生,即使相应的递归被破坏,因此不再被调用。 –