midway icon indicating copy to clipboard operation
midway copied to clipboard

[Discuss]如何刚好解决子应用被卸载时还能继续轮询逻辑

Open xmsz opened this issue 4 years ago • 2 comments

背景

  • 我们有个需求,就是用点击了「同步」按钮,我们开始异步进行同步
  • 前端会开始轮询结果
  • 轮询结束后弹出成功

需求很简单,但是遇到的问题是

  • 这个逻辑在子应用里
  • 一旦用户跳出了子应用,子应用被卸载
  • 那轮询函数就不会执行
  • 因为setTimeout不知具体什么情况被清除了?(子应用卸载时取消所有定时器?子应用window对象被清除?)

我们限制的条件或者需求有

  • 尽量不和父应用有耦合逻辑,即子应用完全独立逻辑

然后我们尝试的方案有

方案一:将逻辑放在父应用,让父应用去执行

这个能解决,但是维护性非常差

方案二:使用父应用的setTimeout

app.on('method', (setTimeout) => void)

child.event.emit('method', (setTimeout) => {setTimeout(()=>)})

这种也能解决需求,但同样非常不优雅 而且这种特殊的逻辑还有同步给其他开发成员的成本,得不偿失

方案三:将子应用的逻辑利用event传递给父应用执行

这个方案原先想象中是最好的,维护性和理解性最好

但是还是没能解决setTimeout被清除的问题 就算一开始就执行了也可能造成内存泄露

有没有更好的方法解决

xmsz avatar Jun 30 '21 01:06 xmsz

不是很明白子应用的范畴,看起来比较简单的做法是解耦,轮询请求接口状态,执行完毕走消息队列更新数据。两边互不干涉。

czy88840616 avatar Jun 30 '21 09:06 czy88840616

不是很明白子应用的范畴,看起来比较简单的做法是解耦,轮询请求接口状态,执行完毕走消息队列更新数据。两边互不干涉。

就是

  • 本来是子应用自己进行触发和轮询更新
  • 但现在用户切换到了其他路由
  • 导致子应用的轮询方法被中断了(因为子应用被卸载,可能定时器也没了)

然后

  • 不想把逻辑放在父应用进行处理
  • 后端也不配合做通知模块

所以想有没有其他方法解决

xmsz avatar Jul 01 '21 08:07 xmsz