我正在遍历数组并调用LoadReportsData
。 getProjectReportsData
中的_reportingService
以正确的顺序被调用。但是,当控件从服务映射返回时被命中,然后.subscribe()
内的代码只有在进行所有调用后才被命中。
之后,结果将分配给this.reportData
,但以随机顺序分配。由于这种行为,我在工作簿中的工作表是随机创建的,而不是按预期的顺序创建的。请建议是否有其他方式拨打电话或提出一些解决方法。
FetchProjectSubmissionReportingAssets(ID: number,
mySelectiontot: number, PRsDelimitedList: string, StartDate: string, EndDate: string) {
let currAsset: string = '';
let ID: number;
var fetchAssetData = {
'CSID': ID
}
this._reportingService.isLoading = true;
this._reportingService.getProjSubRptAssets(fetchAssetData).pipe(
map(result => {
if (result != null) {
for (var i = 0; i < result.length; i++) {
this.ProjReqSubmissionReportingAssets = result;
currAsset = result[i].option;
ID = result[i].id;
this.LoadReportsData(ID, currAsset, i);
}
}
}))
.subscribe();
}
LoadReportsData(CSAsID: number, currAsset: string, tabIndex: number) {
this.wb = XLSX.utils.book_new();
var indata = {
'CSID': this.CSID,
'CSAsID': CSAsID,
'StartDate': this.StartDate,
'EndDate': this.EndDate,
'PRsDelimitedList': this.PRsDelimitedList
}
this._reportingService.getProjectReportsData(indata).pipe(
map(result => {
this.reportData = result;
this.idx = this.idx + 1;
if (this.reportData != null) {
this.ws = this.ws + '_' + tabIndex.toString();
this.ws = XLSX.utils.json_to_sheet(this.reportData);
XLSX.utils.book_append_sheet(this.wb, this.ws, currAsset);
console.log(currAsset);
}
if (this.ProjReqSubmissionReportingAssets.length == this.idx) {
var currDateTime = this.fn_getTimeStamp();
XLSX.writeFile(this.wb, "ProjReport_" + this.HCs + "_" + currDateTime + ".xlsx");
}
}))
.subscribe();
this._reportingService.isLoading = false;
}
答案 0 :(得分:0)
您可以使所有数组组成一个数组,并combineLatest
组成一个数组,而不是在循环内进行API调用。然后,订户将最终以正确的顺序接收数据。
通常,是这样的:
this._reportingService.getProjSubRptAssets(fetchAssetData).pipe(
filter(result => result !== null),
map(result => result.map(
curAsset => this.LoadReportsData(curAsset.id, curAsset, i)
)),
switchMap(requestsArray => combineLatest(requestsArray))
).subscribe(
resultArray => {
// resultArray should consist responses of API calls in the same order
// the results getProjSubRptAssets(fetchAssetData) came in
})