Угловой вызов функции после заполнения подписки - PullRequest
0 голосов
/ 31 мая 2018

Возникают проблемы с получением правильного значения в логике представления.

По сути, служба вызывается, проходит через массив и заполняет его, затем мне нужно, чтобы он вызвал закрытую функцию, когда код массива будет завершен.

calculateSemesterGPA(semesterId: string, userId: string) {

let gradesArr = [];
let resultsArr = [];
let result;

this.getSemesterGrades(semesterId).valueChanges()
.subscribe(snapshots => {
  snapshots.forEach(snapshot => {
    gradesArr.push(snapshot.grade)  
  });
});

this.getScales(userId).valueChanges()
.subscribe(snapshots => {
  snapshots.forEach(snapshot => {
    for(let i = 0; i < gradesArr.length; i++) {
      if(gradesArr[i] === snapshot.letter) {
        resultsArr.push(snapshot.points);
      }
    }
    result = this.CalculateGPA(resultsArr)
  });
})

return result;

}

/*
    Function to calculate the gpa score of an array passed in.
*/
private CalculateGPA(gradePoints: number[]) {

    let length = gradePoints.length;
    let total = 0;

    for(let i = 0; i < length; i++) {
      total += (gradePoints[i]*1);
    }

    // returns the total grade score divided by the amount of grades in the array.
    console.log(total / length)
    return (total / length);
}

Я знаю, что приватная функция работает правильно, поскольку она console.log имеет правильные значения.Но кажется, что оригинальная функция возвращает результат, не дожидаясь завершения части this.getScales.Я тоже пытался вернуться прямо из этой части.

1 Ответ

0 голосов
/ 31 мая 2018

Вы возвращаетесь за пределы вашего subscription, поэтому, пока ваш subscription собирается и выбирает данные, и выполняет вычисления, вы уже вернулись.Возвращение внутрь подписки также не очень хорошая идея.И где вы ожидаете увидеть return?Что такое valueChanges().subscribe вернет Subscription.Почему бы вам не сделать result переменной класса и напрямую назначить ее в своей подписке следующим образом:

this.result = this.CalculateGPA(resultsArr);

Теперь, если вам действительно нужно вернуться из этого метода, тогда не subscribe, а вместо этого выполните map и:

return this.getScales(userId).valueChanges().map(() => {
    ...
    return result
    ...
})

, а затем вам нужно subscribe к возвращенному значению.

РЕДАКТИРОВАТЬ

Я только что видел, что вы размещали подписки одна за другой одним способом: calculateSemesterGPA(semesterId: string, userId: string) {}.Мы не можем сказать, какая подписка будет успешной в первую очередь.Пожалуйста, вложите вторую подписку под первой, чтобы вы действительно были уверены, что вторая запускается только после завершения первой.

this.getSemesterGrades(semesterId).valueChanges()
   .subscribe(snapshots => {
      snapshots.forEach(snapshot => {
         gradesArr.push(snapshot.grade)  
      });

      this.getScales(userId).valueChanges()
        .subscribe(snapshots => {
          snapshots.forEach(snapshot => {
          for(let i = 0; i < gradesArr.length; i++) {
            if(gradesArr[i] === snapshot.letter) {
              resultsArr.push(snapshot.points);
            }
          }
         this.result = this.CalculateGPA(resultsArr)
         });
        })    
   });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...