首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当ids不断增加时,cancelAnimationFrame是如何工作的?

当ids不断增加时,cancelAnimationFrame是如何工作的?
EN

Stack Overflow用户
提问于 2019-04-29 19:31:13
回答 1查看 293关注 0票数 0

背景:

当使用setInterval或setTimeout时,我们会收到一个Id来取消/清除操作。

setInterval/setTimeout:

代码语言:javascript
复制
const timeoutId = setTimeout(() => {clearTimeout(timeoutId)}, 1000);
const intervalId = setInterval(() => {clearInterval(intervalId)}, 1000);

requestAnimationFrame:在使用raf时,对于每一步的迭代,我们重置rafId,而我们只在最新的rafId上调用cancelAnimationFrame?

代码语言:javascript
复制
let rafId;

function step(timestamp) {
  rafId = requestAnimationFrame(step);
  console.log(timestamp, rafId)
  if(timestamp >= 1000) {
    cancelAnimationFrame(rafId);
  }
}
rafId = requestAnimationFrame(step);

问题:如何知道在不断更新requestAnimationFrame时关闭对requestAnimationFrame的所有调用?

我猜想,cancelAnimationFrame是在frameId的基础上工作的,并关闭了它背后的一切。

如果是这样的话,它如何与多个requestAnimationFrames (因为他们将共享frameIds)一起工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-29 20:11:44

的确,requestAnimationFrame返回的id不断增加1,但这并不重要。要保持请求“活动”,您需要在回调中重新请求它。让我们看看最后一次触发回调函数步骤时会发生什么:

代码语言:javascript
复制
function step(timestamp) {
  console.log("before " + rafId);
  rafId = requestAnimationFrame(step);
  console.log("after " + rafId);
  if (timestamp >= 1000) {
    cancelAnimationFrame(rafId);
  }
}
rafId = requestAnimationFrame(step);

如果您查看控制台中的最后两行,如下所示:

在50之前

后51

这意味着上次回调返回的id是50,现在我们请求一个获得id 51的新动画框架。这一次我们的if条件是真的,所以它取消了id 51的请求。在调用回调函数时,id 50的请求已经完成,因此不需要取消它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55909709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档