如何等待订阅循环完成?

时间:2020-04-24 22:23:25

标签: angular typescript

我的方法

    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,但是现在我不知道如何在循环中使用它。

1 个答案:

答案 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()函数