React Native 中 setTimeout 的准确性

问题描述 投票:0回答:2

我正在 React Native 中构建一个节拍器。播放一次点击后,我为下一次点击设置了

setTimeout
。然而,时机太糟糕了。

我做了以下快速测试:

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

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

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

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

有人知道这是由于

setTimeout
不准确还是
(new Date()).getTime()
不准确吗?我可以解决这个问题吗?

javascript reactjs react-native settimeout
2个回答
8
投票

您为

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

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


1
投票

我研究了几乎所有用于播放音频的 React Native 解决方案以及使用 JavaScript

setTimeout
/
setInterval
的各种方法,但没有一个在时间稳定性和准确性方面令人满意。

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

© www.soinside.com 2019 - 2024. All rights reserved.