【问题标题】:React Native Warning: "Setting a timer for a long period of time...". How to locate cause?React Native 警告:“长时间设置计时器......”。如何定位原因?
【发布时间】:2018-03-12 19:26:29
【问题描述】:
【问题讨论】:
标签:
android
node.js
reactjs
react-native
【解决方案1】:
这是一个警告,即某些 javascript 依赖项将因 react-native 本身的问题而引发,必须在 react-native 的代码库中解决,但不必担心。如果它打扰你只需添加console.ignoredYellowBox = ['Setting a timer'];。要找出导致它的依赖项,您必须使用 chrome 调试应用程序并确保启用源映射。
【解决方案2】:
https://github.com/facebook/react-native/issues/12981 说你需要编辑服务器文件。在你的 index.js 文件中
var server = require('https').Server(options, app);
var io = require('socket.io')(server);
改成
var server = require('https').Server(options, app);
var io = require('socket.io')(server,{pingTimeout: 30000});
然后运行forever restartall重启
【解决方案3】:
此链接将对您有所帮助
https://github.com/facebook/react-native/issues/12981#issuecomment-499827072
代码(来自这里:firebase/firebase-js-sdk#97(评论))只是简单地包装了 setTimeout(全局)函数,以防止它被长时间使用。
在我们修改后的 global.setTimeout 函数中,如果持续时间大于阈值 MAX_TIMER_DURATION_MS,我们会在本地映射 (timerFix) 中保存一个 id,然后调用 runTask 将持续时间拆分为更小的值。 runTask 使用较小的块设置超时(使用原始的_setTimeout),这些块将连续执行,直到等待时间太小。当 waitingTime 足够小时,我们调用 React Native 的 runAfterInteractions 以顺利执行,同时,我们从本地映射中删除 id 条目,因为在这种情况下我们不会再次调用 _setTimeout。请注意,将 afterTime 输入 _setTimeout 以防止它被长时间调用。
否则,在我们修改的global.setTimeout函数中,如果持续时间小于阈值MAX_TIMER_DURATION_MS,我们直接调用全局setTimeout(保存在_setTimeout中)。
全局 clearTimeout 也被包装以通过从本地地图中删除 id 来执行清理过程。