如何解决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 举报,一经查实,本站将立刻删除。