Насколько я понимаю, причина, по которой это происходит, заключается в том, что forEach является синхронным по своей природе, но эта конкретная строка асинхронна:
this.fileService.getImage(std.imageUrl).subscribe(data => {
this.createImageFromBlob(data);
});
Вместо этого вы можете выполнить Обещания следующим образом:
this.userService.getStudentsOfLoggedUser().subscribe(res => {
this.loadingData = true;
let count = 0;
new Promise((resolve, reject) => {
res.forEach(std => {
count++;
if (std.imageUrl == null) {
this.students.push({ student: std, hasImage: false, image: undefined });
} else {
this.fileService.getImage(std.imageUrl).subscribe(data => {
this.createImageFromBlob(data);
});
this.students.push({ student: std, hasImage: true, image: this.imageToShow });
}
if (count > res.length -1) {
resolve(); //Resolve condition
}
});
}).then(() => {
this.loadingData = false;
})
});
Таким образом, ваш код будет разрешен только после завершения всех асинхронных вызовов, что не позволит вам получить неопределенные данные.