顺序调用函数时kendoWindow的close方法未即时生效该如何修复
kendoWindow close方法调用后延迟生效问题修复
问题根因
浏览器中JS执行线程与UI渲染线程互斥,kendoWindow.close()触发的DOM更新、关窗动画属于UI渲染队列任务,不会在调用close()的瞬间同步完成。如果在close()之后直接调用的GetDatafromfunc1()是长耗时同步任务,会持续占用主线程,阻塞渲染队列执行,直到所有同步代码运行完成,浏览器才会有空执行关窗、显示loading弹窗的渲染操作,最终表现为两个操作都等数据方法跑完才生效。
可行修复方案
方案1:用setTimeout将耗时逻辑推入下一个事件循环
将后续的loading展示、数据获取逻辑放到setTimeout回调中,给浏览器留出执行UI渲染的空档,0ms延迟即可满足需求:
function buttonclick(){ const windowInstance = $("#Window1").data("kendoWindow"); windowInstance.close(); $("#loadingpopup").show(); // 等当前渲染队列执行完成后再跑耗时逻辑 setTimeout(() => { GetDatafromfunc1(); }, 0); }
方案2:绑定kendoWindow原生close事件(更稳妥)
如果kendoWindow配置了自定义关窗动画,用组件自带的close事件触发后续逻辑,可以完全保证关窗操作执行完毕后再跑后续代码,不会出现时机偏差:
function buttonclick(){ const windowInstance = $("#Window1").data("kendoWindow"); // 用one绑定一次性事件,避免重复触发回调 windowInstance.one("close", () => { $("#loadingpopup").show(); GetDatafromfunc1(); }); windowInstance.close(); }
优化提示
- 如果
GetDatafromfunc1()包含大量同步计算逻辑,建议拆分长任务、或移入Web Worker执行,避免主线程阻塞导致loading动画卡顿。 - 不要在触发UI更新操作后立刻执行长耗时同步代码,这类代码会直接阻塞所有页面渲染。
内容的提问来源于stack exchange,提问作者Eman Ashraf
相关产品推荐
相关产品推荐

