繁体   English   中英

React Native 中 setTimeout 的准确性

[英]Accuracy of setTimeout in React Native

我正在 React Native 中构建一个节拍器。 播放一次点击后,我为下一次点击设置了一个setTimeout 然而,时机很糟糕。

我做了以下快速测试:

let time = (new Date()).getTime() + 50;

setTimeout(() => {
  console.log(time - (new Date()).getTime());
}, 50)

理想情况下,我应该在控制台中得到 0。 在 Chrome Dev Tools 中的 React Native 之外运行它时,我得到 -1,有时 -2(毫秒)。 这是一个可以接受的结果。

在 macOS 上使用模拟器在 React Native 中运行它,我得到 0 到 -100 之间的值。 这显然是不能接受的。

有人知道这是由于setTimeout的不准确还是(new Date()).getTime()的不准确吗? 我可以解决这个问题吗?

您为setTimeoutsetInterval配置的延迟不应被视为确切的延迟时间。 它们代表在执行函数之前您将等待的“最短”时间。 这是因为用户代理在时间过去后将回调放入事件队列,但如果用户代理仍在处理其他任务,回调将留在那里。

您还应该知道,有一个内置的绝对最短时间,您永远无法低于大约 9-14 毫秒。 这是由于用户代理的内部结构。

我调查了几乎所有用于播放音频的 React Native 解决方案以及使用 javascript setTimeout()/setInterval() 的各种方法,但在时间稳定性和准确性方面,没有一个是令人满意的。

可能目前唯一的方法是将一些像这样的本机模块粘合: https : //developer.apple.com/library/content/samplecode/HelloMetronome/Introduction/Intro.html到 js 端,如 RN Docs 中所述: https://facebook.github.io/react-native/docs/native-modules-ios.html ,这给出了相当不错的结果,但不幸的是,当然,它仅适用于 iOS。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM