React Native 中 setTimeout 的准确性

Art*_*r C 5 javascript settimeout reactjs react-native

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

我做了以下快速测试:

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

setTimeout(() => {
  console.log(time - (new Date()).getTime());
}, 50)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sco*_*cus 7

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

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


khr*_*kin 1

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

也许目前唯一的方法是将一些像这样的本机模块粘合到 JS 端,如RN 文档中所述。这给出了相当不错的结果,但当然仅限于 iOS。