我最近了解了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()
。但希望这里有人可以给出更明智的答案。
答案 0 :(得分:2)
你是对的,在至少调用doStuff
之前,你的回调才会被调用。
动画内容的nascent specification是指窗口事件循环的HTML5规范queuing a task的概念。这与setTimeout
和setInterval
使用的概念相同,当时间已过期,并且意味着当回调将在那个时刻排队时,浏览器会等待在执行队列中的下一个任务之前,下一个主要的JavaScript UI线程可用。事件发生同样的事情;事件可以随时发生,包括JavaScript代码运行时,但对处理程序的调用将排队,直到主UI线程可以自由处理它。
我知道Javascript本质上是单线程的......
JavaScript,这种语言,对线程的概念保持沉默。在浏览器中,有一个主要线程可以与DOM交互,零个或多个web worker线程不能(他们可以做其他事情,并与主UI线程交换消息,作为事件回调到达,其中......排队如上:-))。