1

Я недавно узнал о requestAnimationFrame и о том, как его можно использовать для планирования кода анимации в синхронизации с внутренним циклом рисования браузера. Но я все еще немного не понимаю, как браузер обрабатывает этот тип планирования. Прерывает ли он мои скрипты, если необходимо, для анимации?Может ли моя функция javascript прерываться рамкой анимации

Рассмотрим следующий фрагмент яваскрипта кода:

function doStuff() { 
    var animated = false; 

    var animation = function() { 
    // perform animation 
    animated = true; 
    } 

    requestAnimationFrame(animation); 

    // perform more operations here 

    // Q: is animated guaranteed to be false here?? 

} 

Я знаю, что Javascript, по существу, однопоточный поэтому мое шестое чувство, что ни при каких обстоятельствах animation() были названы уже тогда, когда мы достигаем последней строки doStuff(). Но, надеюсь, кто-то здесь может дать более обоснованный ответ.

ответ

2

Вы верны, ваш обратный вызов не будет вызываться до тех пор, пока не будет завершен звонок до doStuff.

nascent specification для анимационного материала относится к концепции спецификации HTML5 queuing a task для цикла событий окна. Это та же концепция, что и для setTimeout и setInterval, когда их время истекло, и означает, что в то время как обратный вызов будет в очереди в этот момент времени, браузер ждет, пока основной поток пользовательского интерфейса JavaScript не будет доступен до запуска следующего задачи в очереди. То же самое происходит с событиями; событие может произойти в любое время, в том числе во время работы вашего кода JavaScript, но вызов вашего обработчика будет стоять в очереди до тех пор, пока основной поток пользовательского интерфейса не сможет его обработать.


Я знаю, что Javascript, по существу, однопоточный ...

JavaScript, язык, ничего не говорится о концепции резьбе. В браузерах есть один основной поток, который может взаимодействовать с DOM, и ноль или более web worker потоков, которые не могут (они могут делать другие вещи и обмениваться сообщениями с основным потоком пользовательского интерфейса, которые поступают как обратные вызовы событий, которые ... . как указано выше :-)).

+0

Спасибо, что подтверждает мое понимание того, как это работает. – themik81