React Native

时间:2017-02-07 21:48:21

标签: javascript reactjs react-native settimeout

我在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(ms)。这是可以接受的结果。

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

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

2 个答案:

答案 0 :(得分:2)

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

你还应该知道,你有一个内置的绝对最短时间,你永远不会在大约9-14ms之内。这是由于用户代理的内部原因。

答案 1 :(得分:1)

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

目前唯一可行的方法是将一些本地模块粘贴到{js侧},如RN Docs:https://developer.apple.com/library/content/samplecode/HelloMetronome/Introduction/Intro.html中所述,这样可以获得不错的结果,但不幸的是当然,这只是iOS。