JQuery / net::ERR_INSUFFICIENT_RESOURCES 在针对 DynamicsCRM 2016 的大量 webapi odata 查询期间:

问题描述

我们使用 MS Dynamics 2016 On Premise(好的,这是旧的,是的,我们正在升级到云环境,但我们还没有) 我们开发了自己的活动历史记录解决方案,该解决方案使用 webapi odata 查询来检索选定帐户上的所有活动,以便将它们呈现为 HTML。 (给定的活动列表当时不太好,现在看起来不一样了)

我们现在的问题是我们在 Chrome 控制台中遇到了很多 net::ERR_INSUFFICIENT_RESOURCES 错误。我们认为在某些情况下,我们从我们的数据库加载了 1800 多个活动,尽管实际上只有少数活动会被渲染。是的,我们的系统中有很多活动,因为我们使用 PowerMailChimp 集成,这使我们的数据库膨胀很多。

因此,我们想调整查询,以便只加载我们实际需要的内容。但我们对 MS Dynamics 2016 的 odata 查询经验并不丰富。

我们的活动历史记录适用于联系人或帐户级别。它总是会查询整个历史(所以当我查看联系人的历史时,它会显示帐户的历史,这是预期的行为)

这是我们用来计算activityids的代码,然后将在第二步加载(见下文):

ActivityHistory.prototype.fetchActivityIds = function () {
    var dfd = jQuery.Deferred();

    if (this.contacts.length == 0 && this.accounts.length == 0) return dfd.reject("No Vips found while fetching activities");
    

    var query_ActivityParty = [];
    for (var dirconId = 0; dirconId < this.contacts.length; dirconId++) {
        query_ActivityParty.push("_partyid_value eq " + this.contacts[dirconId]);
    }
    // query activities of accounts
    for (var accId = 0; accId < this.accounts.length; accId++) {
        query_ActivityParty.push("_partyid_value eq " + this.accounts[accId]);
    }

    // var queryurl_ActivityParty = ["activityparties?$select=_activityid_value&$filter=(",")"];
    var queryurl_ActivityParty = ["activityparties?$select=_activityid_value,activityid_activitypointer&$filter=(",")"];

    console.log("queryurl_ActivityParty: "+queryurl_ActivityParty);
    AHistory.p_query_ActivityParty = AHistory.chunkedReadApi(queryurl_ActivityParty,query_ActivityParty);
    AHistory.p_query_ActivityParty.then(
        function (ActivityPartyIds) {
            for (var subcon = 0; subcon < ActivityPartyIds.length; subcon++) {
                if (ActivityPartyIds[subcon]["_activityid_value"] != null) {
                    var id = normId(ActivityPartyIds[subcon]["_activityid_value"]);
                    AHistory.activities.checkNadd(id);
                }
            }
            dfd.resolve();

        },function (error) {
            console.log("problems while query:"+error);
        }
    );

    return dfd.promise();
};

是否可以更改查询以便仅选择活动 ID。所以我们想过滤掉一些类型代码,或者只让电话通过(例如)。此外,我们想过滤开始时间(例如过滤掉所有超过 3 个月的时间)。

我们已经研究了网络,并发现了这一点(很清楚这是指 MS Dynamics 365 而不是 MS 2016 onprem):https://docs.microsoft.com/en-us/dynamics365/customer-engagement/web-api/activityparty?view=dynamics-ce-odata-9

但它与我们在系统上使用的非常匹配。 从上面的文档中,活动方不允许过滤活动类型代码或计划开始。

我们没有以上经验在查询中加入活动数据,因此我们也可以过滤这些属性

当前解决方案的总体设计如下:

[...]
            AHistory.p_fetchActivities = AHistory.fetchActivityIds();
            AHistory.p_fetchActivities.then(
                function () {
                    // Fetch Activity Data
                    AHistory.p_fetchActivities_Data = AHistory.fetchRenderedActivitiesData();

                    $.when.apply($,[AHistory.p_fetchActivities_Data,AHistory.p_fetchNotes]).then(
                        function () {
                            AHistory.render();
[...]

因此我们认为它首先调用 fetchActivityIds()(参见第一个代码),然后调用(使用结果集)fetchRenderedActivitiesData 读取如下

ActivityHistory.prototype.fetchRenderedActivitiesData = function () {
    var dfd = jQuery.Deferred();
    var _ajax_promises = [];
    if (this.activities.length == 0) return dfd.reject("No Activity IDs found");

    for (i = 0; i < this.activities.length; i++) {
        _ajax_promises.push(this.fetchRenderedActivity(this.activities[i]));

    }

    $.when.apply($,_ajax_promises).then(
        function () {
            dfd.resolve();
        },function () {
            dfd.reject("Couldn't retrieve and render all Activities");
        });

    return dfd.promise();
};

使用:

ActivityHistory.prototype.fetchActivityIds = function () {
    var dfd = jQuery.Deferred();

    if (this.contacts.length == 0 && this.accounts.length == 0) return dfd.reject("No Vips found while fetching activities");
    

    var query_ActivityParty = [];
    for (var dirconId = 0; dirconId < this.contacts.length; dirconId++) {
        query_ActivityParty.push("_partyid_value eq " + this.contacts[dirconId]);
    }
    // query activities of accounts
    for (var accId = 0; accId < this.accounts.length; accId++) {
        query_ActivityParty.push("_partyid_value eq " + this.accounts[accId]);
    }

    // var queryurl_ActivityParty = ["activityparties?$select=_activityid_value&$filter=(",function (error) {
            console.log("problems while query:"+error);
        }
    );

    return dfd.promise();
};

那么还有没有其他好的地方可以过滤掉不必要的活动类型代码和/或过滤计划开始/结束时间。

我知道这是一个相当具体的开发人员问题,尤其是您需要对 dynamics2016 有相当深刻的理解,并且要很好地了解 jquery(我不知道)和 javascript。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...