-
Notifications
You must be signed in to change notification settings - Fork 2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
🐛 fix the issue which an auto closed dialog with a timer would not be cleared after app unmounted #360
Conversation
… cleared after app unmounted
这个可以有单测 case 么 |
我加下 |
所以现在是在卸载的时候 提前 执行这个 timer 了? |
比如什么问题? |
单测加了 @howel52 |
可能是会出一些问题,比如 slave 有个 |
改路由的场景是有点蛋疼。 |
还想到一个可能比较小众的场景,如果有人在 class component 里用 setTimeout 去模拟 setInterval 的话(同时 timer 可能是记在 实例中),这块貌似会有点问题 |
这个确实更蛋疼。 |
还有一种解法,执行 handler 之前先把 window.setTimeout = noop,这样就能避免递归 setTimeout 了.. |
这种可能并不能完全解决问题,handler 里不一定是直接调 setTimeout 的,可能通过其他方法包了一下
这种的话 handler 执行过程中是不是有可能会把上下文里正常的 setTimeout 给 miss 了 |
handler 执行中如果调用了 setTimeout 实际是调用了 noop 这应该是符合预期的。handler 调用完之后 setTimeout 会重置成正常状态 |
比如 timer1、timer2 这种情况,timer1 handler 执行的过程中,timer2 正常的 setTimeout 被 noop 了。 而预期应该是 timer1 handler 执行过程中,只避免 timer1 中的 setTimeout 被递归 |
所有未被 clear 的 timeout 在 free 的时候都会被调用一次 handler,这个过程是同步的,也就是这期间 handler 里如果还有 setTimeout 调用的话都是无效的,这应该是符合预期的,不然就又要重复 记录 timer -> 看是否清除 -> 自动清除 的过程。 window.setTimeout = noop;
timers.forEach(({ handler, id, args }) => {
// clear the timers and execute its handler to avoid uncleared effects
// such as antd auto closing message
handler(...args);
window.clearTimeout(id);
});
window.setTimeout = rawWindowTimeout;
window.clearTimeout = rawWindowClearTimout; |
想了下干脆 setTimeout 不处理了,只处理 setInterval(直接 clear 也不调 handler)。 |
恢复到之前的场景,自动清理未执行的 timeout 跟 interval。antd message 之类的场景在 umi 插件及 faq 里给出解决方案。 |
LGTM |
resolve https://github.com/umijs/qiankun/projects/2#card-34875468
This change is