javascript - 将内部函数的返回值返回到父函数 - Javascript、Dynamics crm

标签 javascript dynamics-crm-2015

下面的代码会将内部函数的 bool 值返回给父函数displayButton()吗?单击 Dynamics CRM 中的按钮即可调用父函数。该函数应返回一个 bool 值,具体取决于是否选择了案例以及所选的案例是否处于事件状态或已解决。

   //function called on click of a button in ms crm. 
    function displayButton()
    {
        var Obj = parent.Xrm.Page.getAttribute("regardingobjectid");
        var ObjValue = Obj.getValue();
        //parent.Xrm.Utility.alertDialog(" Value: " + ObjValue);
        if (ObjValue == null)
            return false;
        //else
        //    parent.Xrm.Utility.alertDialog(" Hi");

        var EntityType = ObjValue[0].entityType;

        var Guid = ObjValue[0].id;
        var id = Guid.slice(1, -1);
        //parent.Xrm.Utility.alertDialog(" Guid: " + id);

//Checking if regarding field is selected a case lookup value
        if (EntityType == "incident")
        {
            var req = new XMLHttpRequest();
            req.open("GET", parent.Xrm.Page.context.getClientUrl() + "/api/data/v8.2/incidents(" + id + ")?$select=statecode", true);
            req.setRequestHeader("OData-MaxVersion", "4.0");
            req.setRequestHeader("OData-Version", "4.0");
            req.setRequestHeader("Accept", "application/json");
            req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
            req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");

            req.onreadystatechange = function ()
            {
                if (this.readyState === 4)
                {

                    req.onreadystatechange = null;
                    if (this.status === 200)
                    {

                        debugger;
                        var result = JSON.parse(this.response);

//checking if selected case is active or resolved.
                        var statecode = result["statecode"];

                        var statecode_formatted = result["statecode@OData.Community.Display.V1.FormattedValue"];
                        if (statecode_formatted == "Active") {
                            return true;

                        }
                        else if (statecode_formatted == "Resolved")
                            return false;
                        else {
                            return false;
                        }
                    }
                    else
                    {
                        parent.Xrm.Utility.alertDialog("Zero");
                    }


                }

            };
            req.send();

        }
        else {
            return false;
        }


    }

最佳答案

没有。如果您想访问异步 XmlHttpRequest 返回的值,则需要将逻辑放在 if (this.status === 200) 范围中,或者提供回调。

由于此行中的 true 参数,您的 XMLHttpRequest 是异步的:

req.open("GET", parent.Xrm.Page.context.getClientUrl() + "/api/data/v8.2/incidents(" + id + ")?$select=statecode", true);

要提供回调,请将代码分成两个函数:

function getCaseState(id, callback) {
    var req = new XMLHttpRequest();
    req.open("GET", parent.Xrm.Page.context.getClientUrl() + "/api/data/v8.2/incidents(" + id + ")?$select=statecode", true);
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.setRequestHeader("OData-Version", "4.0");
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");

    req.onreadystatechange = function () {
        if (this.readyState === 4) {
            req.onreadystatechange = null;
            if (this.status === 200) {
                var result = JSON.parse(this.response);
                var statecode = result["statecode"];
                var statecode_formatted = result["statecode@OData.Community.Display.V1.FormattedValue"];

                callback(statecode_formatted);
            }
        }
    };
    req.send();
}

然后调用 getCaseState,向其传递事件的 id 以及请求准备好后调用的函数:

// called on click of a button in CRM. 
function displayButton() {
    var regarding = parent.Xrm.Page.getAttribute("regardingobjectid").getValue();
    var entityType = regarding[0].entityType;
    var regardingId = regarding[0].id.slice(1, -1);

    // Check if regarding is an active case.
    if (entityType == "incident") {
        getCaseState(regardingId, function(state) {
            var isActive = state === "Active";

            if (isActive) {
                // TODO
            }
        });
    }
}

上面代码中传递的函数是匿名的——您应该将其进一步分离并命名。

关于javascript - 将内部函数的返回值返回到父函数 - Javascript、Dynamics crm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43512446/

相关文章:

javascript - 将 PostgreSQL 数据正确解析为 Highcharts 图表对象

javascript - onClick 监听器未触发 react

c# - 如何识别非人类用户?

javascript - 如何自动设置文本区域高度

java - 如何根据数据库文本区域 'height'更改表格背景?

javascript - 使用 HTML5 + Javascript 将数据字符串保存为文件,而不使用 URI

c# - 如何将 asp 网页集成到 dynamics crm 2015

javascript - 使用 Javascript 自动填充字段

javascript - OnReadyStateComplete 未被触发

javascript - 使用 JavaScript 的 CRM Dynamics 2015 功能区按钮触发器插件