Как дождаться окончания подписки в l oop? - PullRequest
0 голосов
/ 25 апреля 2020

Мой метод

    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, затем я беру оценку этого ответа и добавляю к сумме, чтобы получить полный балл за тест.

answers1 являются элементами radioButton.

Как мне получить окончательный this.sum после того, как l oop закончится? Я думаю, я могу использовать forkJoin, но я не знаю, как использовать его в циклах.

1 Ответ

2 голосов
/ 25 апреля 2020

попробуйте это:

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() для создания массива наблюдаемых для передачи в forkJoin() функцию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...