我有个接口需要 10 秒钟调用一次,但是根据业务反馈一个多小时后接口就请求不到数据了。我查了日志,发现一个多小时之后就没有再调这个接口了。
查了谷歌,找到了一个 Chrome 88+ 会在页面隐藏 5 分钟后将计时器限制为 1 分钟一次,我自己测试也确实看到了这种情况。但是没有找到 1 小时后停止的相关信息。
问了 chatGPT ,他给我了一个因为性能考虑会在一小时后做限制,但是没有信源也不知道该不该相信他。
另外,这种情况要怎么解决呢?限制为 1 分钟一次我查到可以通过播放声音来取消限制,但是停止就不知道了。
1
christin OP 不好意思看错了,是 setInternal.
```javascript useEffect(() => { timer = setInterval(() => { let nowTime = moment().format('YYYY-MM-DD HH:mm:ss'); let beforeTime = moment(nowTime).subtract(6, 'h').format('YYYY-MM-DD HH:mm:ss'); //umi 请求接口 dispatch({ type: 'namespace/query', payload: { type: 1, date: [beforeTime, nowTime] }, }); }, 10000) return componentWillUnmount; }, []); ``` |
2
bjzhush 2022-12-10 23:13:42 +08:00
我先善意嘲讽一下啊,你居然会寄希望与 chatGPT 这种玩具,是不是喝多了哈哈哈
不是写 JS 的,帮你搜了下,用的关键词是 chrome inactive tab settimeout ,大致看到了一些解决方案,没看太细致。 https://developer.mozilla.org/en-US/docs/Web/API/setTimeout 这个里面提到了 Timeouts in inactive tabs ,给出了一些解决方案。 另外 StackOverflow 上也有一些讨论, 比如 https://stackoverflow.com/questions/6032429/chrome-timeouts-interval-suspended-in-background-tabs 最后不建议在 js 中直接搞 10 秒调用 1 次这种任务,毕竟浏览器的非活动页面不是那么可靠,chrome 有一些定时请求和刷页面的扩展可以考虑让用户来使用 |
3
bjzhush 2022-12-10 23:14:40 +08:00
另外 inactive tab 可以考虑换成 background tab ,貌似 chrome 中这种叫法多一些
|
4
christin OP @bjzhush 感谢回复,我自己尝试了一下发现 1 小时后停止 setInternal 并不是必现的,可能是其他原因导致的。业务方也没有做额外的测试就汇报了这个问题。
另外麻烦问一下您说的“chrome 有一些定时请求和刷页面的扩展可以考虑让用户来使用”具体是指什么呢? |
5
bjzhush 2022-12-11 00:22:39 +08:00
|
6
christin OP @bjzhush 不好意思我又查了一下我们的日志,发现每天都会出现一段时间之后直接停止请求的情况。
https://imgur.com/a/8y8K5Cf https://imgur.com/a/GpnnThp https://imgur.com/a/2N7Wc0b 图里面是这一个接口一天的请求情况,柱状图的高度代表请求次数。 麻烦问一下这种情况有碰到吗?我在 so 里面看到的都是减慢请求频率,没有这种直接停止的情况。 这种插件在我们的业务中有点不太好用,我打算用播放音频的方式来试一下,如果还是不行的话就只能用 websocket 或者 web worker 来改造了。希望这样能够解决停止请求的问题。 |
7
bjzhush 2022-12-11 09:03:41 +08:00 via iPad
如果我是你,我会把请求这个事放到服务器端来做,浏览器只看状态统计和执行开始以及停止动作
|