Dynamics retrieveMultipleRecords 异步问题
Dynamics retrieveMultipleRecords asynchronous issue
我对 Xrm.WebApi.retrieveMultipleRecords
有疑问,希望能得到一些提示或建议。
Withing Dynamics 365 我有一个包含 DevExpress 控件的对话框。此控件需要使用一组发票模板进行初始化。
我的代码(摘录):
对话框html:
<script language="javascript" type="text/javascript">
debugger;
Globalize.culture('de-CH');
var TableContent = getInvoiceTemplates();
var dataGridTemplates = $("#TemplateContainer").dxDataGrid({
dataSource: TableContent,
selection: {
mode: 'single'
},
.....
.....
数据源(TableContent)由函数getInvoiceTemplates()
初始化
function getInvoiceTemplates()
{
debugger;
var TableContent = new Array();
var fetchTemplates = "<fetch>"+
" <entity name='invoice'>" +
" <attribute name='name' />" +
" <attribute name='invoiceid' />" +
" <filter type='and' >" +
" <condition attribute='ambcust_vorlage_twooption' operator='eq' value='1' />" +
" </filter>" +
" <order attribute='name' descending='false' />" +
" </entity>" +
"</fetch>";
fetchTemplates = "?fetchXml=" + encodeURIComponent(fetchTemplates);
Xrm.WebApi.retrieveMultipleRecords("invoice", fetchTemplates).then(
function success(result)
{
for (var i = 0; i < result.entities.length; i++)
{
var RowContent = new Object();
if(result.entities[i].invoiceid != null)
{
RowContent["TemplateID"] = result.entities[i].invoiceid;
}
else
{
RowContent["TemplateID"] = "";
}
if(result.entities[i].name != null)
{
RowContent["TemplateName"] = result.entities[i].name;
}
else
{
RowContent["TemplateName"] = "";
}
TableContent.push(RowContent);
}
return TableContent;
},
function (error)
{
alert("Error");
}
);
}
问题是该函数正确检索了模板,并且函数中的 属性 TableContent
包含模板,但它总是 returns null,因此控件的数据源在对话框中将为空。
我知道 API 函数是异步的,但我认为在成功回调中返回数组就足够了。
我是不是漏掉了什么?
您可以在 successCallback
本身内移动您正在使用 TableContent
做某事的代码来克服这个问题。
Xrm.WebApi.retrieveMultipleRecords("invoice", fetchTemplates).then(
function success(result)
{
for (var i = 0; i < result.entities.length; i++)
{
var RowContent = new Object();
....
TableContent.push(RowContent);
}
var dataGridTemplates = $("#TemplateContainer").dxDataGrid({
dataSource: TableContent,
selection: {
mode: 'single'
},
},
function (error)
{
alert("Error");
}
);
我对 Xrm.WebApi.retrieveMultipleRecords
有疑问,希望能得到一些提示或建议。
Withing Dynamics 365 我有一个包含 DevExpress 控件的对话框。此控件需要使用一组发票模板进行初始化。
我的代码(摘录):
对话框html:
<script language="javascript" type="text/javascript">
debugger;
Globalize.culture('de-CH');
var TableContent = getInvoiceTemplates();
var dataGridTemplates = $("#TemplateContainer").dxDataGrid({
dataSource: TableContent,
selection: {
mode: 'single'
},
.....
.....
数据源(TableContent)由函数getInvoiceTemplates()
function getInvoiceTemplates()
{
debugger;
var TableContent = new Array();
var fetchTemplates = "<fetch>"+
" <entity name='invoice'>" +
" <attribute name='name' />" +
" <attribute name='invoiceid' />" +
" <filter type='and' >" +
" <condition attribute='ambcust_vorlage_twooption' operator='eq' value='1' />" +
" </filter>" +
" <order attribute='name' descending='false' />" +
" </entity>" +
"</fetch>";
fetchTemplates = "?fetchXml=" + encodeURIComponent(fetchTemplates);
Xrm.WebApi.retrieveMultipleRecords("invoice", fetchTemplates).then(
function success(result)
{
for (var i = 0; i < result.entities.length; i++)
{
var RowContent = new Object();
if(result.entities[i].invoiceid != null)
{
RowContent["TemplateID"] = result.entities[i].invoiceid;
}
else
{
RowContent["TemplateID"] = "";
}
if(result.entities[i].name != null)
{
RowContent["TemplateName"] = result.entities[i].name;
}
else
{
RowContent["TemplateName"] = "";
}
TableContent.push(RowContent);
}
return TableContent;
},
function (error)
{
alert("Error");
}
);
}
问题是该函数正确检索了模板,并且函数中的 属性 TableContent
包含模板,但它总是 returns null,因此控件的数据源在对话框中将为空。
我知道 API 函数是异步的,但我认为在成功回调中返回数组就足够了。
我是不是漏掉了什么?
您可以在 successCallback
本身内移动您正在使用 TableContent
做某事的代码来克服这个问题。
Xrm.WebApi.retrieveMultipleRecords("invoice", fetchTemplates).then(
function success(result)
{
for (var i = 0; i < result.entities.length; i++)
{
var RowContent = new Object();
....
TableContent.push(RowContent);
}
var dataGridTemplates = $("#TemplateContainer").dxDataGrid({
dataSource: TableContent,
selection: {
mode: 'single'
},
},
function (error)
{
alert("Error");
}
);