Dynamics CRM中Xrm.Navigation.openConfirmDialog返回null问题求助
嗨,咱们来拆解一下你为什么会拿到null,以及怎么解决这个问题。
这个问题的核心在于异步操作的处理逻辑——Xrm.Navigation.openConfirmDialog是一个异步方法,它返回的是一个Promise对象,但你的confirmationBox函数目前并没有正确返回这个Promise链,导致调用时直接拿到了函数的默认返回值undefined(你看到的null应该是环境下的表现差异),而非你期望的true/false。
为什么原代码会返回null?
JavaScript里的异步操作不会阻塞代码执行:当你调用confirmationBox时,函数会立即执行到Xrm.Navigation.openConfirmDialog,然后直接结束函数(此时对话框还没被用户操作,.then()里的逻辑根本没跑)。由于你的函数没有返回任何值,temp就会被赋值为函数的默认返回值undefined,在你的环境中显示为null。
修复方案:让函数返回Promise链
只需要修改confirmationBox函数,让它返回Xrm.Navigation.openConfirmDialog的Promise链即可:
function confirmationBox(promptText, w, h) { var confirmationStrings = { text: promptText, title: "ConfirmationBox", cancelButtonLabel: "No", confirmButtonLabel: "Yes" }; var confirmationDimension = { height: h, width: w }; // 关键:返回整个Promise对象 return Xrm.Navigation.openConfirmDialog(confirmationStrings, confirmationDimension).then( function (success) { if (success.confirmed) { console.log("Confirmed"); return true; } else { console.log("Not Confirmed"); return false; } }); }
正确的调用方式
因为现在函数返回的是Promise,你不能直接用var temp = confirmationBox(...)赋值,得用以下两种方式处理结果:
方式1:使用.then()链式调用
confirmationBox(promptText, 350, 450).then(function(result) { console.log(result); // 这里会正确拿到true或false });
方式2:在async函数中使用await
如果你的上下文允许使用async/await(比如在另一个async函数里),可以这样写:
async function handleUserConfirmation() { var temp = await confirmationBox(promptText, 350, 450); console.log(temp); // 同样能拿到正确的true/false } // 调用这个async函数 handleUserConfirmation();
额外说明
你对success.confirmed的判断逻辑是完全正确的——这个属性就是Dynamics CRM用来标识用户点击了确认按钮(true)还是取消按钮(false)的,只需要把异步流程处理对就能拿到你想要的返回值了。
内容的提问来源于stack exchange,提问作者Mohsin A.

