2017-06-17 29 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は無視され、何も返しませんでしたし、それがplayTimeoutundefinedを割り当てます。

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

Aha!したがって、タイムアウトをクリアするための実際のID値はないので、今後のオーディオタイムアウトは、対応する再帰が壊れてもそれ以上コールされなくても、スケジュールどおりに発生します。 –