You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dynamics 365异步操作问题:等待WebApi获取用户详情后执行对比

问题解决:Dynamics 365视图中异步对比用户Azure AD ID显示图标失效

问题原因

你的代码核心问题是异步函数处理不当:fetchAndCompareUserIds是async函数,调用时未使用await关键字,导致finalOutput拿到的是处于pending状态的Promise对象,而非预期的0或1,switch判断自然无法触发对应逻辑。

另外,原代码对executionContext的处理存在错误:executionContext是Dynamics 365提供的上下文对象,不需要用JSON.parse解析,直接通过它获取表单字段值即可。

修正后的代码

async function compareUser(executionContext) {
    // 获取当前登录用户ID(移除大括号)
    const globalContext = Xrm.Utility.getGlobalContext();
    const loggedinUserId = globalContext.userSettings.userId.replace(/[{}]/g, "");

    // 获取字段值:修正executionContext的使用方式
    const formContext = executionContext.getFormContext();
    const userListField = formContext.getAttribute("suyog_userlist");
    if (!userListField || !userListField.getValue()) {
        console.log("字段值为空");
        return ["suyog_testredicon", "Red"]; // 字段为空时默认显示红色图标
    }
    const fieldValID = userListField.getValue()[0].id.guid;

    // 等待异步对比完成,拿到结果
    const finalOutput = await fetchAndCompareUserIds(loggedinUserId, fieldValID);

    // 根据结果返回对应图标
    switch (finalOutput) {
        case 1:
            console.log("用户匹配");
            return ["suyog_testgreenicon", "Green"];
        case 0:
            console.log("用户不匹配");
            return ["suyog_testredicon", "Red"];
        default:
            console.log("对比出错");
            return ["suyog_testredicon", "Red"]; // 异常情况默认红色图标
    }
}

async function fetchAndCompareUserIds(loggedinUserId, fieldValID) {
    try {
        // 异步获取当前用户的Azure AD ID
        const result = await Xrm.WebApi.online.retrieveRecord(
            "systemuser",
            loggedinUserId,
            "?$select=azureactivedirectoryobjectid"
        );
        const fetched_aad_id = result.azureactivedirectoryobjectid;

        console.log(`对比:${fieldValID} vs ${fetched_aad_id}`);

        // 对比两个ID,返回结果
        return fieldValID === fetched_aad_id ? 1 : 0;
    } catch (error) {
        console.error("获取用户信息出错:", error.message);
        return 0; // 出错时默认返回不匹配
    }
}

关键改动说明

  1. 异步处理修正:将compareUser改为async函数,调用fetchAndCompareUserIds时添加await,确保等待异步API请求完成后再执行后续判断逻辑。
  2. 上下文处理修正:通过executionContext.getFormContext()正确获取表单上下文,再读取字段值,避免错误的JSON解析操作。
  3. 异常与边界处理:增加字段为空、API请求失败的情况处理,避免代码崩溃,同时保证任何场景下都能返回图标信息。
  4. 代码优化:用正则表达式一次性移除用户ID的大括号,简化字符串处理;用三元表达式简化对比逻辑,提升可读性。

内容的提问来源于stack exchange,提问作者foodiepanda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 20:00:00