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 :D
-
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 :D
@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.
-
@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!
-
@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")) { .... } -
@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!
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; }
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden