midway
midway copied to clipboard
[Discuss]如何刚好解决子应用被卸载时还能继续轮询逻辑
背景
- 我们有个需求,就是用点击了「同步」按钮,我们开始异步进行同步
- 前端会开始轮询结果
- 轮询结束后弹出成功
需求很简单,但是遇到的问题是
- 这个逻辑在子应用里
- 一旦用户跳出了子应用,子应用被卸载
- 那轮询函数就不会执行
- 因为setTimeout不知具体什么情况被清除了?(子应用卸载时取消所有定时器?子应用window对象被清除?)
我们限制的条件或者需求有
- 尽量不和父应用有耦合逻辑,即子应用完全独立逻辑
然后我们尝试的方案有
方案一:将逻辑放在父应用,让父应用去执行
这个能解决,但是维护性非常差
方案二:使用父应用的setTimeout
app.on('method', (setTimeout) => void)
child.event.emit('method', (setTimeout) => {setTimeout(()=>)})
这种也能解决需求,但同样非常不优雅 而且这种特殊的逻辑还有同步给其他开发成员的成本,得不偿失
方案三:将子应用的逻辑利用event传递给父应用执行
这个方案原先想象中是最好的,维护性和理解性最好
但是还是没能解决setTimeout被清除的问题 就算一开始就执行了也可能造成内存泄露
有没有更好的方法解决
不是很明白子应用的范畴,看起来比较简单的做法是解耦,轮询请求接口状态,执行完毕走消息队列更新数据。两边互不干涉。
不是很明白子应用的范畴,看起来比较简单的做法是解耦,轮询请求接口状态,执行完毕走消息队列更新数据。两边互不干涉。
就是
- 本来是子应用自己进行触发和轮询更新
- 但现在用户切换到了其他路由
- 导致子应用的轮询方法被中断了(因为子应用被卸载,可能定时器也没了)
然后
- 不想把逻辑放在父应用进行处理
- 后端也不配合做通知模块
所以想有没有其他方法解决