如何在订阅中正确分配字段?



我正在用Angular写一个项目,但在我看来,我的问题与此无关。我按顺序发送请求,并试图将响应值分配给双数组private labels: any [][] = [[]];

getInfo(url: string, command: string, accessToken: string, companyToken: string, size: number) {
return this.httpClient.post(url,
JSON.stringify({
'cmd': 'getInfo',
'command': command,
'date': this.getDate(),
'accessToken': accessToken,
'companyToken': companyToken,
'size': size
})
);
}
getData() {
for (let i = 0; i < this.commands.length; i++) {
let labelsArr: string[] = [];
let dataArr: string[] = [];
this.getInfo(this.url, this.commands[i], this.accessToken, this.companyToken, 12)
.subscribe(
response => {
for (let j = 0; j < Object.keys(response).length; j++) {
labelsArr[j] = Object.entries(response)[j][1][0];
dataArr[j] = Object.entries(response)[j][1][1];
}
this.labels[i] = labelsArr;
//not empty
console.log(this.labels);
this.AllData[i] = dataArr;
});
}
//empty
console.log(this.labels);
}

在getData()我输出结果数组,事实是,它不是空的输出到subscribe,但如果我试图显示subscribe以外的字段的值,结果是数组是空的,我不明白这是什么连接,有人可以建议吗?

p。S

我认为这是由于响应来得比我有时间使用标签晚,我如何使它们同步?

订阅回调中的代码在getData()中的console.log(this.labels)之后异步执行。如果需要在所有getInfo()请求之后使用this.labels,则需要异步执行。使用forkJoin来连接所有的getInfo() observable:

getData() {
const observables = [];
for (let i = 0; i < this.commands.length; i++) {
observables.push(this.getInfo(this.url, this.commands[i], this.accessToken, this.companyToken, 12));
}
forkJoin(observables).subscribe(responses => {
for(response of responses) {
let labelsArr: string[] = [];
let dataArr: string[] = [];
for (let j = 0; j < Object.keys(response).length; j++) {
labelsArr[j] = Object.entries(response)[j][1][0];
dataArr[j] = Object.entries(response)[j][1][1];
}
this.labels[i] = labelsArr;
this.AllData[i] = dataArr;
}
});
}

也有其他选择,比如将每个可观察对象映射到它自己的管道中,然后将它们连接起来。此外,getInfo()应该返回一个类型化对象,因此您不需要使用Object.keys

ok,成功了

async getData() {
for (let i = 0; i < this.commands.length; i++) {
let labelsArr: string[] = [];
let dataArr: string[] = [];
await this.getInfo(this.url, this.commands[i], this.accessToken, this.companyToken, 12)
.toPromise().then(
response => {
for (let j = 0; j < Object.keys(response).length; j++) {
labelsArr[j] = Object.entries(response)[j][1][0];
dataArr[j] = Object.entries(response)[j][1][1];
}
this.labels[i] = labelsArr;
this.AllData[i] = dataArr;
});
}
//
console.log(this.labels);
}

最新更新