Javascript 函数仍在执行任务时停止回调
问题:当函数当前正在执行以前执行的任务时,是否可以忽略回调,阻止它再次启动 我有两个功能。函数1使用setTimeout触发一个音频文件,并对其自身进行回调。它使用Math.roundMath.random*aStartMax+astarmin;在随机的时间以循环的方式发出声音。函数2执行视觉动画,该动画需要一定的时间才能完成。当前,每当函数1触发声音时,回调函数就会执行执行视觉动画的函数2。问题出现在函数1发出声音的频率高于函数2动画完成所需的频率,从而导致动画跳回其开始位置(看起来有故障)。我不想降低函数1的触发频率,我只是希望函数2忽略它收到的回调(如果它已经在运行)。这可能吗?这样,声音可以以任何频率发射,但视觉动画只有在当前未处于运动状态时才会执行Javascript 函数仍在执行任务时停止回调,javascript,animation,audio,callback,settimeout,Javascript,Animation,Audio,Callback,Settimeout,问题:当函数当前正在执行以前执行的任务时,是否可以忽略回调,阻止它再次启动 我有两个功能。函数1使用setTimeout触发一个音频文件,并对其自身进行回调。它使用Math.roundMath.random*aStartMax+astarmin;在随机的时间以循环的方式发出声音。函数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;
}