javascript - 反应保持间隔在后台运行
问题描述
我在任何地方都找不到我的问题的答案。
长话短说,我有一个 Web 应用程序(MERN 堆栈),我想定期从前端(反应)向后端(节点)发出请求,即使在组件卸载或用户关闭页面时也是如此。
目前这是我的代码,如果我在那个特定的页面/路由中,它可以正常工作。但如果我关闭页面并返回,它会重置间隔。
let updateCycle; // to make sure there is only 1 interval
useEffect( () => {
if (!updateCycle)
updateCycle = setInterval(() => {
myFunction() // calling the function
}, 10 * 60 * 1000); // every 10 mins
},[myFunction])
那么我该怎么做呢?还是我必须将整个事情移到后端?
解决方案
您需要的是该钩子的清理功能
基本上 useEffect 钩子可以返回一个在清理该钩子时将被调用的函数。
所以你的代码现在必须是:
let updateCycle
useEffect(() => {
updateCycle = setInterval(myFunction, 10 * 60 * 1000) // Set a timer as a side effect
return () => clearInterval(updateCycle) // Here is the cleanup function: we take down the timer
},[myFunction])
当不再需要副作用时,React 基本上会调用清理函数。
也就是说,它将在 componentUnMount 上调用它,或者就在重新调用 useEffect 基函数之前(当 myFunction 指针更改并导致效果刷新时)
如果您需要始终运行的功能,请将其移动到始终安装的组件!我不建议在组件消失时留下副作用,因为这就是您在应用程序中创建内存泄漏并且难以重现错误的方式。
顺便说一句,当用户关闭页面时保持任何类型的代码运行是完全不可能的。也许你想象错了?
推荐阅读
- hybris - 多次申请产品合作伙伴固定价格促销
- c# - 找不到 Windows 运行时类型“Windows.Web.UI.WebViewControlSettings”
- python - 有没有办法为 jupyter 笔记本中的新单元格设置默认标签?
- angular - 角度阻塞(同步)http调用
- python - 有没有办法遍历执行功能的熊猫日期时间系列?
- javascript - Angular(Javascript)如何控制mousemove事件的速度?
- angularjs - 如何在单击谷歌地图标记弹出窗口时添加输入控件
- javascript - 如何使百分比出现在另一个输入栏中?
- ms-access-2010 - 在访问报告文本框中更改控制源
- python - 查找具有不同格式日期的 2 列之间的绝对差异作为天数