不能将箭头函数与 CRM WebApi v9 和打字稿一起使用
Cannot use arrow functions with CRM WebApi v9 and typescript
我正在努力将 js 代码升级到 Dynamics 365 的新 V9 版本,但在使用 Xrm.WebApi(也将 js 升级到 ts)时无法使用箭头函数。
例如,这不起作用:
Xrm.WebApi.retrieveMultipleRecords(
'mks_entitlementline',
`$select=mks_name, _mks_parententitlementid_value&$filter=_mks_parententitlementid_value eq '${eId}'`).then(
(results) => {
if (!this.commonUtils.isUndefinedOrNull(results) && results.entities.length > 0) {
this.usesELS();
} else {
this.notUsingELS();
}
// filter contact lookup
this.filterContactLookup("", eId);
this.refreshPriorities(eId);
if (this.commonUtils.isUndefinedOrNull(this.formContext.getAttribute<Xrm.Attributes.LookupAttribute>('primarycontactid').getValue())) {
this.formContext.getControl<Xrm.Controls.LookupControl>('primarycontactid').setDisabled(false);
}
}).catch(error => {
console.log("ERROR -> entitlementSlaManagementOnUpdate: ", error);
Xrm.Utility.alertDialog("E----", () => { });
});
但这确实如此(在我看来更丑陋):
Xrm.WebApi.retrieveRecord("role", searchedId, "$select=name")
.then(
function (role: { roleid: string, name: string }) {
outArr.push({ Id: role.roleid, Name: role.name, Type: "role" });
if (rolesAndTeams.length === outArr.length) {
if (!error) {
_onOk(outArr);
}
_onErr(errorObject)
}
},
function (err) {
errorObject = err;
error = true;
})
我收到的错误是:
Xrm.WebApi.retrieveMultipleRecords(...).then(...).catch 不是函数
基本上告诉我 'catch' 无效,但我不知道为什么无效,因为它对 ts 编译器没问题...我还尝试配置 tsconfig 文件以在 es5 和es2017 但它也没有用。
所以...箭头函数可以与Xrm.WebApi一起使用吗?如果是这样...我在做什么 wrong/not 在做什么?
提前致谢!
我不认为问题是由箭头函数引起的。我认为 catch
是问题所在。如果 return 值是 any
类型,编译器不会告诉您任何信息。我不知道情况是否如此,但如果您查看 CRM API,您将看到以下签名:
Xrm.WebApi.retrieveMultipleRecords(entityLogicalName, options, maxPageSize).then(successCallback, errorCallback);
没有提到 catch
,但您可以将 errorCallback
传递给 then
。
顺便说一句,这是方法,你在第二个例子中传递 errorHandler
。
所以试试这个:
Xrm.WebApi.retrieveMultipleRecords(
'mks_entitlementline',
`$select=mks_name, _mks_parententitlementid_value&$filter=_mks_parententitlementid_value eq '${eId}'`).then(
(results) => {
if (!this.commonUtils.isUndefinedOrNull(results) && results.entities.length > 0) {
this.usesELS();
} else {
this.notUsingELS();
}
// filter contact lookup
this.filterContactLookup("", eId);
this.refreshPriorities(eId);
if (this.commonUtils.isUndefinedOrNull(this.formContext.getAttribute<Xrm.Attributes.LookupAttribute>('primarycontactid').getValue())) {
this.formContext.getControl<Xrm.Controls.LookupControl>('primarycontactid').setDisabled(false);
}
},
error => {
console.log("ERROR -> entitlementSlaManagementOnUpdate: ", error);
Xrm.Utility.alertDialog("E----", () => { });
});
我正在努力将 js 代码升级到 Dynamics 365 的新 V9 版本,但在使用 Xrm.WebApi(也将 js 升级到 ts)时无法使用箭头函数。
例如,这不起作用:
Xrm.WebApi.retrieveMultipleRecords(
'mks_entitlementline',
`$select=mks_name, _mks_parententitlementid_value&$filter=_mks_parententitlementid_value eq '${eId}'`).then(
(results) => {
if (!this.commonUtils.isUndefinedOrNull(results) && results.entities.length > 0) {
this.usesELS();
} else {
this.notUsingELS();
}
// filter contact lookup
this.filterContactLookup("", eId);
this.refreshPriorities(eId);
if (this.commonUtils.isUndefinedOrNull(this.formContext.getAttribute<Xrm.Attributes.LookupAttribute>('primarycontactid').getValue())) {
this.formContext.getControl<Xrm.Controls.LookupControl>('primarycontactid').setDisabled(false);
}
}).catch(error => {
console.log("ERROR -> entitlementSlaManagementOnUpdate: ", error);
Xrm.Utility.alertDialog("E----", () => { });
});
但这确实如此(在我看来更丑陋):
Xrm.WebApi.retrieveRecord("role", searchedId, "$select=name")
.then(
function (role: { roleid: string, name: string }) {
outArr.push({ Id: role.roleid, Name: role.name, Type: "role" });
if (rolesAndTeams.length === outArr.length) {
if (!error) {
_onOk(outArr);
}
_onErr(errorObject)
}
},
function (err) {
errorObject = err;
error = true;
})
我收到的错误是:
Xrm.WebApi.retrieveMultipleRecords(...).then(...).catch 不是函数
基本上告诉我 'catch' 无效,但我不知道为什么无效,因为它对 ts 编译器没问题...我还尝试配置 tsconfig 文件以在 es5 和es2017 但它也没有用。
所以...箭头函数可以与Xrm.WebApi一起使用吗?如果是这样...我在做什么 wrong/not 在做什么?
提前致谢!
我不认为问题是由箭头函数引起的。我认为 catch
是问题所在。如果 return 值是 any
类型,编译器不会告诉您任何信息。我不知道情况是否如此,但如果您查看 CRM API,您将看到以下签名:
Xrm.WebApi.retrieveMultipleRecords(entityLogicalName, options, maxPageSize).then(successCallback, errorCallback);
没有提到 catch
,但您可以将 errorCallback
传递给 then
。
顺便说一句,这是方法,你在第二个例子中传递 errorHandler
。
所以试试这个:
Xrm.WebApi.retrieveMultipleRecords(
'mks_entitlementline',
`$select=mks_name, _mks_parententitlementid_value&$filter=_mks_parententitlementid_value eq '${eId}'`).then(
(results) => {
if (!this.commonUtils.isUndefinedOrNull(results) && results.entities.length > 0) {
this.usesELS();
} else {
this.notUsingELS();
}
// filter contact lookup
this.filterContactLookup("", eId);
this.refreshPriorities(eId);
if (this.commonUtils.isUndefinedOrNull(this.formContext.getAttribute<Xrm.Attributes.LookupAttribute>('primarycontactid').getValue())) {
this.formContext.getControl<Xrm.Controls.LookupControl>('primarycontactid').setDisabled(false);
}
},
error => {
console.log("ERROR -> entitlementSlaManagementOnUpdate: ", error);
Xrm.Utility.alertDialog("E----", () => { });
});