Ожидание завершения requestAnimationFrame (с помощью обратных вызовов)
Так что я новичок здесь, извиняюсь, если это основной вопрос, но я не вижу ответа на него где-либо еще.
Я пытаюсь написать веб-приложение, которое показывает анимацию (используя pixijs), а затем отображает div с запросом ответа. Моя проблема заключается в том, что, поскольку анимация обрабатывается с использованием requestAnimationFrame, анимация происходит асинхронно, и поэтому фазы отклика и анимации происходят одновременно (div появляется мгновенно и затемняет анимацию).
Теперь я посмотрел вокруг, и, похоже, консенсус заключается в том, чтобы использовать функцию обратного вызова, которая запускается только после выполнения всей асинхронной работы, позволяющей это последовательное развитие.
ОДНАКО, requestAnimationFrame принимает форму
requestAnimationFrame (update_screen_objects),
но ломается, когда я пытаюсь сделать:
requestAnimationFrame (update_screen_objects (response_phase_callback))
ясно, что requestAnimationFrame не нравится, когда ему передают функцию, которая сама имеет обратный вызов. Поэтому мой вопрос: что я должен сделать с циклом анимации, чтобы гарантировать, что последующие функции будут выполняться ПОСЛЕ завершения анимации?
Спасибо!
РЕДАКТИРОВАТЬ
Это пример кода в приведенной выше форме, который не работает.
function animate(callback) {
var finished = false;
if ((new Date().getTime()) < adaptTime){
runFlicker(false);
} else if ((new Date().getTime()) < judgeTime){
hideAdaptors();
} else if ((new Date().getTime()) > judgeTime){
stage.visible = false;
finished = true;
}
renderer.render(stage);
if (!finished){
requestAnimationFrame( animate(callback) ); //Ensures it will keep looping
//requestAnimationFrame(animate); //This does work, but my issue still persists
} else {
callback(); //By the time callback() is required, you can't access it as requestAnimationFrame doesn't accept animate() with a function passed to it.
}
}
2 ответа
Попробуйте это. Вам в основном нужно сгенерировать этот шаг (animate
) функция с обратным вызовом, вместо передачи результатов вашего вызова animate
, который был бы undefined
,
function generateAnimation(callback) {
function step() {
var finished = false;
var now = (new Date()).getTime();
if (now < adaptTime) {
runFlicker(false);
} else if (now < judgeTime) {
hideAdaptors();
} else if (now > judgeTime) {
stage.visible = false;
finished = true;
}
renderer.render(stage);
if (!finished) {
requestAnimationFrame(step);
} else {
callback();
}
}
return step;
}
// Usage:
requestAnimationFrame(generateAnimation(callback));
Нет необходимости в сложной оболочке, просто сделайте:
requestAnimationFrame(update_screen_objects.bind(window, response_phase_callback))
Это " currys" функция update_screen_objects путем частичного применения некоторых аргументов. Результатом.bind(context, arg1) является функция, которая при вызове принимает только те аргументы, которые еще не связаны, например, arg2, arg3 и т. Д.