Dynamics 365 JS调用业务流程流moveNext时脏表单双保存如何规避
问题背景
- 使用JavaScript调用
formContext.data.process.moveNext(callbackFunction)实现业务流程流阶段前进时,若当前表单为存在未保存修改的脏表单,方法执行前需要先完成表单保存。 - 常规实现思路是先手动触发表单保存,再调用
moveNext方法,但moveNext本身会触发第二次表单保存,导致整体流程响应缓慢。 - 点击界面原生「下一阶段」按钮时,系统仅触发一次保存即可同步完成保存与阶段跳转,执行效率更高。
待解决问题
- 如何通过JavaScript实现脏表单场景下调用
moveNext时避免双保存问题? - 是否可以直接调用原生「下一阶段」按钮绑定的内置函数实现同等效果?
解决方案
脏表单下调用moveNext避免双保存的实现方法
核心逻辑是去掉手动提前触发的表单保存操作,直接复用moveNext方法内置的保存逻辑,只需要补充回调错误处理即可,不会触发重复保存,实现代码如下:
function moveToNextStage(formContext) { const moveNextCallback = (result) => { if (result.status !== "success") return; // 跳转成功后激活目标阶段,和原生逻辑保持一致 formContext.data.process.setActiveStage(result.stage, () => {}); }; // 方法本身自带脏检测,无修改时直接跳转无额外开销,有修改时自动触发单次保存 formContext.data.process.moveNext(moveNextCallback); }
moveNext方法的原生执行逻辑本身就包含脏表单检测:检测到未保存修改时会自动触发单次表单保存,保存成功后才执行阶段跳转,和手动点击原生按钮的执行链路完全一致,不会产生第二次保存请求。如果业务中存在自定义onSave校验逻辑,不要在保存事件中无差别调用preventDefault,避免打断内置保存流程。
直接调用原生「下一阶段」按钮内置函数的可行性
不推荐使用这种方案:
- 业务流程流原生按钮的绑定函数属于平台未公开的内部实现,不同产品版本、月度更新中都可能调整函数名、执行逻辑,直接调用内部函数的代码兼容性极差,版本迭代后极易出现无征兆的功能失效,平台官方也不会为这类未公开API的使用提供支持。
- 上述优化后的
moveNext调用方案已经和原生按钮的执行逻辑、性能表现完全一致,仅触发一次保存即可完成全流程操作,完全可以满足效率要求,不需要冒险调用内部未公开方法。
内容的提问来源于stack exchange,提问作者Easy Tiger
相关产品推荐
相关产品推荐

