2017-09-13 1 views
0

Dieses Problem sollte ziemlich einfach sein: Ich möchte den Status jeder Abfrage in ein Array namens currentValues ​​schieben. Leider ist die currentValues-Array unpopulated bleibt (die Ausgabe von Prüfwerte ist 0vs2. Was ich hier fehlt?Array-Push funktioniert nicht richtig

@Input() public wantedValue: string[]; 
    @Input() public querySensor: string[]; 
    @Input() public slideId: number; 
    @Output() wantedStateAccievedEvent: EventEmitter<any> = new EventEmitter<any>(); 
    public currentValues: string[] = []; 

    initItems() { 
    for (let sensor of this.querySensor) { 
     console.log("Sensor: " + sensor); 
     this.itemService.getMockItemState(sensor).subscribe(
     status => { this.currentValues.push((status)); }); 
    } 
    this.checkValues(); 
    } 

    checkValues(): void { 
    console.log("Called checkValues" + this.currentValues.length + "vs " + this.wantedValue.length); 
    let i = 0; 
    let allSatisfied: boolean; 
    for (let value of this.currentValues) { 
     console.log("Wert: " + value + '\n'); 
     if (this.wantedValue[i] !== value) { 
     allSatisfied = false; 
     } 
     i++; 
    } 
    if (allSatisfied === true) { 
     this.wantedStateAccievedEvent.emit({slideId: this.slideId, stateAccieved: true }); 
    } 
+0

Mögliche Duplikat [Angular 2 - Daten direkt von einem Observable zurückgeben] (https://stackoverflow.com/questions/37867020/angular-2-return-data-directly-from-an- observable) – jonrsharpe

+0

Haben Sie überprüft, was der Wert des 'status' ist? Was ist die Ausgabe, wenn Sie Folgendes hinzufügen: 'console.log (status ');'? – mok

+0

Hallo, der Status hat immer einen Wert - die ganze Sache funktionierte ohne Verwendung von Arrays, nach Änderung von wantedVaule und querySensor zu Arrays erschien das Problem – jibjapda

Antwort

0

Sie mit this.itemService.getMockItemState(sensor).subscribe einem asynchronen Ereignis abonnieren möchte. So ist es möglich, dass, wenn Sie anrufen this.checkValues() die Veranstaltung war bereits nicht ausgelöst

verschieben Versuchen Sie, die this.checkValues() für eine Füllung Sekunden oder den Anruf innerhalb der abonnieren Funktion bewegen.

this.itemService.getMockItemState(sensor) 
    .subscribe(status => { 
    this.currentValues.push(status); 
    this.checkValues(); 
    }); 
+0

Hallo vielen Dank für die Antwort - das funktioniert, habe ich den Code geändert: zu Ihnen Vorschlag, aber jetzt wird das Array einfach riesig! sogar mit 'für (lassen Sie mich in diesem.querySensor) { console.log (" Sensor: "+ this.querySensor [i]); this.itemService.getMockItemState (this.querySensor [i]). Subscribe ( status => { this.currentValues ​​[i] = status; }); this.checkValues ​​(); } } ' Das Array wird größer - mein mok Service: ' getMockItemState (item: String): beobachtbare { return Observable.interval (500) .map (() => 'OPEN'); } ' – jibjapda

+0

Am Ende funktionierte es genau so - danke für deine Hilfe – jibjapda