Ich habe eine Klasse, die bei der Initialisierung Daten von einem Dienst abruft und eine seiner Eigenschaften auffüllt, die ein Array ist. Diese selbe Klasse hat eine Funktion, die dieses Array sortiert, filtert und zurückgibt. Wenn ich ein Objekt dieser Klasse instanziiere und diese Funktion aufruft, merke ich, dass es aufgerufen wird, bevor seine Konstruktor- und ngOnInit() - Funktionen ausgeführt werden (wahrscheinlich, weil ich asynchronen Inhalt von den Observablen verwende, die der Dienst zurückgibt). Wie kann ich garantieren, dass Konstruktor und Init vollständig ausgeführt wurden, bevor irgendeine Funktion meiner Klasse extern aufgerufen wird?Wie kann sichergestellt werden, dass Konstruktor/ngOnInit ausgeführt wird, bevor Funktionen aus einer Klasse aufgerufen werden?
export class BaseChoice implements PickAppraiser, OnInit {
weight = 0;
options = new Array<PickQuality>();
constructor(private championService: ChampionService) {}
ngOnInit() {
// Iterates through the list of champions adding them to the current object
this.championService.getChampions()
.subscribe(champions => {
// Iterates through the list of champions adding them to the current object
Object.keys(champions).map(key => this.options.push(new PickQuality(champions[key], 0)))
})
}
choose(n?: number): PickQuality[] {
var sorted = this.options.sort((a, b) => a.score - b.score);
return sorted;
}
}
Ich habe auch versucht, so etwas wie
choose(n?: number): PickQuality[] {
// Iterates through the list of champions adding them to the current object
this.championService.getChampions()
.subscribe(champions => {
// Iterates through the list of champions adding them to the current object
Object.keys(champions).map(key => this.options.push(new PickQuality(champions[key], 0)))
this.reevaluate(this.options);
var sorted = this.options.sort((a, b) => a.score - b.score);
var chosen;
if(n) chosen = sorted.slice(1, n);
else chosen = sorted.slice(1, 2);
return chosen;
});
}
zu tun, wo ich von der Asynchron-Anfrage innerhalb der Auswahl() -Methode laufen selbst, aber es wird mich nicht so tun lassen, Ich nehme an, weil die Rückgabevariable nicht garantiert ist zu existieren.
Dies hängt davon ab, wie der Inhalt extern aufgerufen wird. Wird es von einer übergeordneten Komponente, einer Direktive, einem Service usw. aufgerufen? Gibt es einen Grund, warum Sie die Liste nach der Kartenfunktion nicht sortieren können? – joh04667
Werfen Sie einen Blick auf [Ist es eine schlechte Übung, eine Konstruktorfunktion eine Versprechung zurückgeben zu lassen?] (Http://stackoverflow.com/q/24398699/1048572). Tue nichts Asynchrones bei der Initialisierung einer Instanz (über den Konstruktor direkt oder eckige Hooks), tue es vor dem Erstellen der Instanz. – Bergi
Wie kann ich vor der Instanzerstellung in einer Klasse etwas tun? Ist der Konstruktor nicht das erste, was in einer Klasse läuft? –