我的方法
onSubmit() {
let answers1 = document.getElementsByName("answer");
let answers = answers1 as unknown as HTMLInputElement;
for (let i = 0; i < answers1.length; i++) {
if (answers[i].checked) {
this.dataService.getAnswerById(answers[i].value)
.subscribe((data: Answer) => {
this.sum += data["mark"];
console.log(this.sum);
})
}
}
console.log(this.sum);
}
我从文档中获得了所有名为answer
的单选按钮(此按钮的值为AnswerId
)。然后,如果选中了按钮,我将使用get方法通过id得到答案,然后我对该答案进行标记并加总和,以得出测试的总分。
answers1
是radioButton元素。
在循环结束后如何获得最终的this.sum
?我想,我可以使用forkJoin,但是现在我不知道如何在循环中使用它。
答案 0 :(得分:2)
尝试一下:
import { forkJoin } from 'rxjs';
...
onSubmit() {
// array of radio buttons
let answers1 = document.getElementsByName("answer");
let answers = answers1 as unknown as HTMLInputElement;
const observables = [];
for (let i = 0; i < answers1.length; i++) {
if (answers[i].checked) {
observables.push(this.dataService.getAnswerById(answers[i].value));
}
}
forkJoin(observables).subscribe((data: Answer[]) => {
this.sum = (data || []).reduce((res, ans: Answer) => res + ans.mark, 0);
console.log(this.sum);
});
// at this point you cannot see this.sum as it collects async data
}
我使用Array.filter()
函数仅过滤已检查的答案,然后使用Array.map()
创建了一个Observable数组以传递给forkJoin()
函数