質問:以前に実行されたタスクを実行している間に関数がコールバックを無視して再起動しないようにすることはできますか?関数の実行中にコールバックを停止する
私には2つの機能があります。 機能番号1は、自身にコールバックするsetTimeout
を使用してオーディオファイルをトリガーします。 Math.round(Math.random() * aStartMax) + aStartMin;
を使用して、サウンドをある程度ランダムに発生させます。 機能#2は、完了に一定の時間がかかるビジュアルアニメーションを実行します。現在、関数#1によってサウンドがトリガされると、コールバックは関数#2を実行し、ビジュアルアニメーションを実行します。問題は、機能#1が、機能#2のアニメーションが完了するのに要する周波数よりも高い周波数で音を発し、アニメーションがその開始点にジャンプする(それが不思議に見える)点にある。ファンクション#1の実行頻度を低下させたくないので、ファンクション#2がすでに実行中の場合に受け取るコールバックを無視したいだけです。これは可能ですか?そうすれば、サウンドはどんな周波数でも発音することができますが、ビジュアルアニメーションは現在動作していない場合にのみ実行されます。
// FUNCTION #1: Audio function
(function loop() {
var rand = Math.round(Math.random() * aStartMax) + aStartMin;
setTimeout(function() {
playDuration = Math.floor((Math.random() * aPlayDurationMax) + aPlayDurationMin);
setTimeout(function() {
var sound = new Howl({
src: [soundFileName],
autoplay: true,
loop: true,
volume: (Math.random() * 0.8) + aVolumeMin,
fade: 0
});
var id2 = sound.play();
sound.fade(0, 1, aFadeIn, id2)
{
do_the_thing($('.a')); // << callback for function #2
};
setTimeout(function() {
sound.fade(1, 0, aFadeOut, id2);
}, playDuration);
}, aWaitToPlay);
loop(); // calls the audio function to execute again
}, rand);
}());
// FUNCTION #2: Visual function
function do_the_thing($elements) {
var delay = $elements.children().length * universalBoxTime;
setTimeout(function() {
$elements.makisu('toggle');
$elements.makisu({
selector: 'dd',
overlap: .7,
speed: 2
});
}, 0);
}
私は以下のようなsetTimeout
で私の#2機能を設定することができますことを読みました。しかし、私はそれが関数が新しいコールバックを無視/ドロップするのを許すとは思っていませんが、むしろ後で起動するように単純にそれらをキューに入れますか?
function yourfoo() {
// code
setTimeout(yourfoo, 3000);
}
setTimeout(yourfoo, 3000);
私のコードをおおまかに機能に差し込むことができれば、それが最も役立ちます。私は数日間、いくつかのバリエーションを試してきましたが、動作させることはできません。 – forestkelley