질문 : 함수가 이전에 수행 한 작업을 수행하면서 콜백을 무시하고 다시 시작하지 못하게 할 수 있습니까?함수가 여전히 수행중인 작업 동안 콜백 중지
두 가지 기능이 있습니다. 함수 # 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