NEWS
Probleme mit SendTo
-
Ich hab den SQL Adapter installiert, mit der Absicht, selber Daten zu schreiben und auch auszulesen. Auf der Info-Seite gibt es ja ein paar Beispiele, wie man das macht (Mit SendTo), aber ich bekomm die Daten nicht aus dieser SendTo Funktion "raus", so dass ich die Daten weiterverarbeiten kann.... Hier mein Beispiel:
var db = "XXX"; var table = "XXX"; var test1 = ""; sendTo('sql.0', 'query', 'SELECT * FROM ' + db + "." + table + ' where datum between "2022-03-01" and "2022-03-28"', function (result) { if (result.error) { console.error(result.error); } else { // show result help_func(JSON.stringify(result.result)); } }); async function help_func(db_wert) { test1 = await db_wert; } console.log(test1);
console.log(test1) bleibt leer. Führe ich das in der help_func() aus, dann wird mir das angezeigt! Ich kann die Daten nicht in die Variable test1 schreiben und außerhalb von SendTo darauf zugreifen, das geht nur innerhalb. Wie kann man dieses Problem lösen? Mein Hirn raucht schon und bin mehr gefrustet als begeistert
Ich hoffe ihr könnt mir Helfen
VG
Steve
-
- warum verwendest du hier async und await?
Die Function, die im sendTo-Aufruf definiert wird, ist ein callback.
dh wenn diese funktion aufgerufen wird, ist das ergebnis bereits in result enthalten und es muss nicht noch gewartet werden.
wenn du im sql einen fehler gemacht hast, steht das in result.error drin.
wenn der sqlbefehl erfolgreich war, stehen die daten in result.result drin.
daher kannst du Zeile 10 direkt mit folgendem ersetzen
console.log(JSON.stringify(result.result));
-
db_wert ist eine variable
async und await können nur vor funktionsbezeichner geschrieben werden.
Zeile 19. der Befehl ist ausserhabl der beiden Blöcke.
an dieser Stelle ist test1 immer noch "".das ist leider etwas das tückische an javascript, das die abarbeitung nicht wie in einer funktionalen programiersprache, welche linear abgearbeitet wird, vergleichbar ist.
die reihenfolge der abarbeitung
1-4 normal
5; der befehl wird gestartet, aber asynchron üer callback. die zeit bis das zurückkehrt ist nicht vorhersehbar und die restlichen befehle des aktuellen blocks müssen noch zu ende abgearbeitet werden
15, aber keine ausführung, sondern hier wird die funktion an sich nur deklariert
19. wie bereits gesagt, wegen zeile 4, ist test1 = ""dann wenn der sendTo fertig ist, wird der callback (2.parameter im sendto aufgerufen).
und dann gehts hier ab zeile 6 weiter.noch eine zusatzinfo
await kann nur vor eine funktionsbezeichner geschrieben werden, der ein sogenanntes promis zurück gibt.
async kapselt automatisch so eine funktion und gibt ohne zutun des programmierers ein promise zurück
await wartet dann so lange bis der promise aufgelöst wird.
aber da muss man sich erst ein wenig reindenken
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Promise
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/async_function
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/await - warum verwendest du hier async und await?
-
Hallo Oliver,
Ursprünglich hatte ich ja kein Await und Async verwendent, sondern:
var db = "XXX"; var table = "XXX"; var test1 = ""; sendTo('sql.0', 'query', 'SELECT * FROM ' + db + "." + table + ' where datum between "2022-03-01" and "2022-03-28"', function (result) { if (result.error) { console.error(result.error); } else { // show result help_func(JSON.stringify(result.result)); } }); function help_func(db_wert) { test1 = db_wert; } console.log(test1);
Ich bin da noch unerfahren, aber mir wurde im FB-ioBroker bereich geraten damit mal zu experimentieren. Es war mir klar, dass ich wohl damit keinen Erfolg habe.
Die SQL Syntax ist richtig, ich bekomme ja meine Daten aus der DB zurück. Das einzige was mir halt noch fehlt ist dass ich außerhalb der Blöcke dann damit arbeiten kann.
So wie ich dich richtig verstanden habe ist, dass der SendTo asynchron gestartet wird und der restliche Code trotzdem weiterverarbeitet wird auch wenn der SendTo Block noch nicht fertig ist. Gibt es denn eine Möglichkeit außerhalb der Blöcke auf das Ergebnis zu warten und erst wenn ich die Daten bekomme dann damit zu arbeiten?
Ich sage aber schonmal Vorab Danke für deine Erklärung
Vielen Dank und dir noch einen schönen Abend
VG Steve
-
Hast du das den mal ausprobiert mit Zeile 10 was ich geschrieben habe?
Was willst du den mit den Daten machen?
Das JSON.stringify ist für die Weiterbearbeitung erst mal nicht hilfreich.
Erst wenn du ein javascript-Objekt in einen Datenpunkt schreiben willst musst du das machen.In result.result ist ja ein Array mit Objekten
Jedes Objekt ein Datensatz aus deiner Datenbank gemäß dem SQLAnsonsten machst du einfach so
var db = "XXX"; var table = "XXX"; var test1 = ""; sendTo('sql.0', 'query', 'SELECT * FROM ' + db + "." + table + ' where datum between "2022-03-01" and "2022-03-28"', function (result) { if (result.error) { console.error(result.error); } else { // show result help_func(result.result); } }); function help_func(result) { console.debug(result); }