Angularjs 函数性能导致数据加载问题



这是我用来从后端检索报告的函数,然后通过映射过程将键从另一个数组映射到对象中每个数组分组的键。getReport(( 函数最初从后端请求数据,但数据在第一次映射后返回为空。一旦再次请求数据,一切就会完美运行。

function getReport() {
vm.loading = true;
vm.selectedReport.reportFunc(location._id, vm.beginDate, vm.endDate, vm.orderStatus.value)
.then(report => {
switch(vm.selectedReport.name) {
case 'Sales by Section': 
getSectionIds();
vm.report = prepareSectionsReport(report);
vm.mergedSectionReport = prepareLineItemSales(vm.report).filter( (line) => { 
if (line) {
return line;
}
});
break;
default:
vm.report = report;
break;
}
vm.loading = false;
});
}
function prepareSectionsReport(report) {
var r = Object.keys(report).map( (sectionId) => {
for (var section of sections) {
if (section && section.sectionId === sectionId) {
let total = report[sectionId].slice(-1)[0];
return {
sectionName: section.name,
section: report[sectionId],
total: total
};
} else if (sectionId === 'N/A') {
let total = report[sectionId].slice(-1)[0];
return {
sectionName: 'N/A',
section: report[sectionId],
total: total
}
}
}
});
r = removeUndefined(r);
return r;
}

问题是由函数加载的顺序引起的,并使用 promise 解决。

function getReport() {
vm.loading = true;
vm.selectedReport.reportFunc(location._id, vm.beginDate, vm.endDate, vm.orderStatus.value)
.then(report => {
switch(vm.selectedReport.name) {
case 'Sales by Section': 
prepareSectionsReport(report).then( (r) => {
vm.report = r;
return vm.report;
}).then( (r) => {
vm.mergedSectionReport = prepareLineItemSales(vm.report).filter( (line) => { 
if (line) {
return line;
}
});
});
break;
default:
vm.report = report;
break;
}
vm.loading = false;
});
}
function getSectionIds() {
return MenuService.query({ location: location._id }).$promise
}
function prepareSectionsReport(report) {
return getSectionIds().then( (menus) => {
menus[0].sections.forEach( (section) => {
vm.sections.push( {
sectionId: section._id,
name: section.name
});
});
}).then( () => {
console.time('sections');
var r = Object.keys(report).map( (sectionId) => {
/* On initial load does not execute this section properly on execute */
for (var section of vm.sections) {
if (section && section.sectionId === sectionId) {
let total = report[sectionId].slice(-1)[0];
return {
sectionName: section.name,
section: report[sectionId],
total: total
};
} else if (sectionId === 'N/A') {
let total = report[sectionId].slice(-1)[0];
return {
sectionName: 'N/A',
section: report[sectionId],
total: total
}
}
/* end of section*/
}
});
console.timeEnd('sections');
r = removeUndefined(r);
return r;
});
}

最新更新