NEWS
Frage zu await function - Zuweisung in Variable
-
Hallo,
ich entwickel gerade einen Adapter.Aktuell verstehe ich:
// Load all Data once before subscribing valuesObj = await this.getInitialValues(configObj);
nicht so ganz.
Denn eine direkte Ausgabe danach mit:
this.log.debug("Objekt: " + JSON.stringify(valuesObj));
liefert nichts.
Erst, wenn ich diese Log-Ausgabe an das Ende der onReady Funktion setze, erscheint etwas. Daraus schließe ich, das hier nicht gewartet wird, bis die Funktion ausgeführt wurde.
Eigentlich müsste die umschließende onReady Funktion doch genau an der Stelle stehenbleiben und warten, bis die getInitialValues Funktion die Daten in das valuesObj geschrieben hat, oder?
Die Funktion sieht wie folgt aus:
async getInitialValues(obj) { let tmpObj = {}; Object.entries(obj).forEach(entry => { const [key, value] = entry; this.getForeignState(value, (err, stateValue) => { if (!key.includes("percent")) { tmpObj[key] = recalculate ? this.recalculateValue(stateValue.val) : stateValue.val; } else { tmpObj[key] = stateValue.val; } }); }); return tmpObj; }
Ich denke, ich habe einfach nur einen Denkfehler
-
@skb der
Fehler ist das du async/await mit callback mischt ohne promises zu benutzen.
das forEach in Zeile 3 deines Skriptes fragt alle Objekte per getForeignState an, wartet aber nicht darauf das die antworten angekommen sind. Deswegen ist wenn die Funktion zurück kommt das Objekt tmpObj nicht gefüllt.
A.
-
@asgothian Danke für den Hinweis.
Wäre es dir möglich, ein kurzes Beispiel einzustellen, damit ich mir dies visuell besser vorstellen kann?
Vielen Dank!
-
@skb nein, leider nicht. Allerdings sollte es die Funktion getForeignState auch als async variable geben, so das du an Stelle des callback auch folgendes Konstrukt machen kannst:
const stateval = await getForeignStarte(value); if (stateval) { if !key.includes("percent")) { .... }
-
Du musst warten, bis Du das Ergebnis hast. Ansonsten wird tmpObj zurückgegeben, obwohl noch gar nicht alle Eigenschaften abgearbeitet wurden.
So z.B.
async getInitialValues(obj) { let tmpObj = {}; for (var key of Object.keys(obj)) { const value = obj[key]; const stateValue = await this.getForeignStateAsync(value); if (!key.includes("percent")) { tmpObj[key] = recalculate ? this.recalculateValue(stateValue.val) : stateValue.val; } else { tmpObj[key] = stateValue.val; } } return tmpObj; }