React Native Warning:"设置计时器很长一段时间......"。如何查找原因?

时间:2017-10-01 14:33:30

标签: android node.js reactjs react-native

iOS上的一切都运行良好。在Android上我收到警告"长时间设置计时器,即多分钟,是Android上的性能和正确性问题,因为它使计时器模块保持清醒状态,并且只有在应用程序时才能调用计时器在前台。有关详细信息,请参阅https://github.com/facebook/react-native/issues/12981。 (看到setTimeout,持续时间为589668ms)"

我不会在我的应用中使用任何计时器,所以我假设这是来自我安装的NPM模块。我怎样才能确定哪一个导致了这个?

我看到我可以ignore the waring,但我想向模块维护者报告此问题。

4 个答案:

答案 0 :(得分:2)

这是一个警告,由于他们自己的问题,某些javascript依赖关系将在react-native上引发,必须在react-native的代码库中解决但不是引起关注的原因。如果它困扰你,只需添加console.ignoredYellowBox = ['Setting a timer'];。要找出导致它的依赖项,您必须使用chrome调试应用程序并确保启用了源映射。

答案 1 :(得分:1)

此链接将为您提供帮助 https://github.com/facebook/react-native/issues/12981#issuecomment-499827072

代码(从此处:firebase / firebase-js-sdk#97(注释))仅包装setTimeout(全局)函数以防止长时间使用。

在修改后的global.setTimeout函数中,如果持续时间大于阈值MAX_TIMER_DURATION_MS,我们将一个ID保存在本地映射(timerFix)中,然后调用runTask将持续时间拆分为较小的值。 runTask使用较小的块设置超时(使用原始的_setTimeout),该块将连续执行,直到waitingTime太小。当waitingTime足够小时,我们调用React Native的runAfterInteractions进行平滑执行,同时,我们从本地映射中删除id条目,因为在这种情况下,我们不会再调用_setTimeout。请注意,afterTime被馈送到_setTimeout中,以防止长时间调用它。

否则,在修改后的global.setTimeout函数中,如果持续时间小于阈值MAX_TIMER_DURATION_MS,则我们直接调用全局setTimeout(保存在_setTimeout中)。

还封装了全局clearTimeout,以通过从本地映射中删除ID来执行清理过程。

答案 2 :(得分:0)

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 :(得分:0)

对于firebase / firestore用户:我只是简单地还原为直接使用REST端点进行firestore调用,而不是尝试掩盖警告。由于我只需要auth和firestore,因此很容易解决了我的问题。此处的代码段:

https://stackoverflow.com/a/62446792