Javascript 函数仍在执行任务时停止回调

Javascript 函数仍在执行任务时停止回调,javascript,animation,audio,callback,settimeout,Javascript,Animation,Audio,Callback,Settimeout,问题:当函数当前正在执行以前执行的任务时,是否可以忽略回调,阻止它再次启动 我有两个功能。函数1使用setTimeout触发一个音频文件,并对其自身进行回调。它使用Math.roundMath.random*aStartMax+astarmin;在随机的时间以循环的方式发出声音。函数2执行视觉动画,该动画需要一定的时间才能完成。当前,每当函数1触发声音时,回调函数就会执行执行视觉动画的函数2。问题出现在函数1发出声音的频率高于函数2动画完成所需的频率,从而导致动画跳回其开始位置(看起来有故障)。

问题:当函数当前正在执行以前执行的任务时,是否可以忽略回调,阻止它再次启动

我有两个功能。函数1使用setTimeout触发一个音频文件,并对其自身进行回调。它使用Math.roundMath.random*aStartMax+astarmin;在随机的时间以循环的方式发出声音。函数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);
}

通过将信息存储在函数本身,可以存储函数或其回调是否仍在运行。我不确定函数2何时完成,可能是在延迟过后?但下面是一个示例:

function do_the_thing() {

    if ( do_the_thing.running ) return;
    do_the_thing.running = true;

    // your code

    setTimeout( () => do_the_thing.running = false, 1000 );

}

这将使do_thing中的实际函数体每秒最多执行一次。理想情况下,当do_thing实际执行完毕时,您可以将do_the_thing.running设置为false。

如果回调函数2正在运行,则将其状态保存在变量中。如果是,不要执行它。如果不是,则执行它。检查下面的伪代码

var isRunning = false;

if(!isRunning) {
   // callback function 2
}

function callback2() {
// execute it
isRunning = false;
}

如果您能够大致地将我的代码插入到您的函数中,那将非常有用。几天来,我一直在尝试一些变体,但都无法实现。如果您能够大致将我的代码插入到您的函数中,那将非常有帮助。几天来我一直在尝试一些变体,但都没能成功。
var isRunning = false;

if(!isRunning) {
   // callback function 2
}

function callback2() {
// execute it
isRunning = false;
}