Dynamics 365:报价表单定时刷新后重复检测状态控制进度指示器
Dynamics 365报价表单进度指示器循环检测实现
现有代码问题分析
- 语法错误:
setTimeout的闭合括号位置错误,导致代码无法正常执行 - 无循环检测逻辑:仅执行一次刷新,刷新后未重新触发状态检测,无法持续监控状态变化
- 未清理定时器:状态变更后仍可能继续触发刷新,造成不必要的性能消耗
修正后的实现代码
function showIndicator(executionContext) { var formContext = executionContext.getFormContext(); var message = 'Quote is being processing'; // 定义定时器变量,用于后续清除 let refreshTimer; // 状态检测逻辑 function checkStatus() { var currentStatus = formContext.getAttribute('statuscode').getValue(); if (currentStatus == 493430001) { // 显示进度指示器(重复调用不会创建多个实例) Xrm.Utility.showProgressIndicator(message); // 3秒后刷新表单并重新检测状态 refreshTimer = setTimeout(function () { formContext.data.refresh(false).then(function () { // 刷新完成后重新执行状态检测 checkStatus(); }); }, 3000); } else { // 关闭进度指示器 Xrm.Utility.closeProgressIndicator(); // 清除定时器,停止循环刷新 if (refreshTimer) clearTimeout(refreshTimer); } } // 首次执行状态检测 checkStatus(); }
关键优化点说明
- 递归循环检测:通过内部函数
checkStatus实现持续监控,表单刷新完成后(借助refresh的Promise回调)重新执行状态判断,确保基于最新数据 - 定时器生命周期管理:状态变更为非处理状态时立即清除定时器,避免无效的重复刷新
- 异步刷新处理:利用表单刷新的异步回调,避免读取未更新的旧状态数据
- 重复显示防护:
Xrm.Utility.showProgressIndicator重复调用不会生成多个指示器,无需额外判断显示状态
内容的提问来源于stack exchange,提问作者Kostas Karagiannis
相关产品推荐
相关产品推荐

