我在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()
的不准确造成的?我能解决这个问题吗?
答案 0 :(得分:2)
您为setTimeout
和setInterval
配置的延迟绝不应被视为确切的延迟时间。它们代表您在执行函数之前等待的“最短”时间。这是因为用户代理在时间结束后将回调放入事件队列,但如果用户代理仍在处理其他任务,则回调将位于此处。
你还应该知道,你有一个内置的绝对最短时间,你永远不会在大约9-14ms之内。这是由于用户代理的内部原因。
答案 1 :(得分:1)
我已经调查了几乎所有用于播放音频的React Native解决方案以及使用javascript setTimeout()/ setInterval()的各种方法,但是它们在时间稳定性和准确性方面都不令人满意。
目前唯一可行的方法是将一些本地模块粘贴到{js侧},如RN Docs:https://developer.apple.com/library/content/samplecode/HelloMetronome/Introduction/Intro.html中所述,这样可以获得不错的结果,但不幸的是当然,这只是iOS。