NEWS
Test SQL-Abfrage
-
@ticaki sagte in Test SQL-Abfrage:
Wenn du eine async funktion ohne await aufrufst ist der rückgabewert nichts.
Stimmt nicht so ganz, es wird ein Promise zurückgegeben.
-
@haus-automatisierung
Merci, meinte mehr das log(async)immer '' ins logschreibt. Oder liege ich damit falsch? Jap lag falsch -
@haus-automatisierung sagte in Test SQL-Abfrage:
Naja, deine Funktion
AvarageTimeInterval
gibt jetzt auch immer ein Promise zurück, muss also mit.then()
oder ebenfalls mitawait
genutzt werden.Ok, werde ich mir versuchen zu merken. Wie sieht denn die Verwendung mit 'await' aus?
Letzte Zeile also z.B. so:
AvarageTimeInterval() .then(val => console.log('Rückgabewert der Funktion=' + val));
Habe das soeben erfolgreich umsetzen können. Genau das, was ich wollte, vielen Dank!!!
Hatte deine Lösung etwas anders geschrieben und dabei kam dann zuerst nix zurück. Der Fehler war, dass ich statt ein "+" ein "," gesetzt habe, im Glauben, dass dies keine Rolle spielen sollte. Zumindest habe ich das von einem anderen Tutorial so "gelernt", ist aber wohl doch falsch???!
AvarageTimeInterval().then(val => console.log('Rückgabewert der Funktion=', val));
Frage: Was macht oder bewirkt dieser Pfeil "=>"?
PS: Was soll denn das ganze JSON.stringify und mit .parse() wieder zurück bewirken? Kann alles weg...
Gute Frage
Ich habe es ohne die Konvertierung versucht, dass hat dann aber leider nicht geklappt. Wenn ich jedoch ein JSON-Objekt baue, dann kann ich auch die .length sowie die .wert Eigenschaft nutzen um an meinen Wert zu kommen, ohne das JSON-Objekt scheint das wohl nicht zu gehen, oder mache ich da wieder etwas falsch?
Die Frage wäre aber auch, warum Du überhaupt das Ergebnis an die übergeordnete Funktion geben willst. Du könntest auch in der Callback-Funktion alles tun, was Du möchtest. Also das Ergebnis in einen Datenpunkt schreiben o.ä.
Naja, ich möchte gerne eine wieder verwendbare Funktion haben, bei der ich dann nur noch die gewünschte Objekt-ID mitgeben kann um so dann vom SQL-Server den gewünschten Wert zu erhalten. Ich weiss (noch) nicht, ob man das in der Callback-Funktion dann auch so machen könnte.
Nochmals vielen Dank für die wertvolle Lehre.
-
@ticaki sagte in Test SQL-Abfrage:
@roga
Funktioniert doch alles wie es sollWenn du eine async funktion ohne await aufrufst ist der rückgabewert nichts.
console.log('Rückgabewert der Funktion=', AvarageTimeInterval()); console.log('Rückgabewert der Funktion=' + AvarageTimeInterval());
Danke für diesen Hinweis mit dem "," bzw. "+". Mit Verwendung des "+" anstelle des "," erhalten ich wenigsten eine brauchbare Rückmeldung, nämlich dass es sich um ein "object Promise" handelt, so wie es haus-automatisierung auch geschrieben hatte.
15:04:15.096 info javascript.0 (31327) script.js._DEVEL.Uebung_1: Rückgabewert der Funktion=[object Promise]
Deine beiden Lösungen haben bei mir auch sehr gut funktioniert, vielen Dank dafür.
async function getValue() { console.log('Rückgabewert der Funktion=' + await AvarageTimeInterval()); } getValue()
Ich mache das nur nicht so, daher keine Ahnung ob es geht, ich gehe so vor:
async function getValue() { let result = await AvarageTimeInterval() log('Rückgabewert der Funktion=' + result); }
Was mir jedoch daran nicht gefällt ist, dass dafür nochmals eine async Function getValue() erstellt werden muss, was ich persönlich etwas umständlicher finde. Ich möchte den Wert im Hauptprogramm direkt zurückerhalten, ohne nochmals eine andere Funktion aufrufen zu müssen. Funktioniert hat es aber einwandfrei.
-
Ich baue alle aufwendigeren Skript so auf
const bla const mehrbla var blabla var mehrblabla async function main() { // code } // letzte Zeile im Skript main()
EDIT: Der main() Aufruf am ende ist wichtig, kanns zwar nicht das wieso erklären, aber wenn das Skript nicht ganz eingelesen ist, kommt es vor, das Funktionen und Variablen die später als der Aufruf definiert werden, Fehler erzeugen.
-
@roga sagte in Test SQL-Abfrage:
Frage: Was macht oder bewirkt dieser Pfeil "=>"?
Das ist eine arrow function. Eine etwas andere Definition einer anonymen Funktion, welche sich etwas anders verhält als mit dem Schlüsselwort
function
. Macht in diesem Beispiel aber keinen Unterschied.Du übergibst eine Funktion als Parameter.
Das ist praktisch das gleiche wie
AvarageTimeInterval().then(function (val) { console.log('Rückgabewert der Funktion=' + val); });
@roga sagte in Test SQL-Abfrage:
Was mir jedoch daran nicht gefällt ist, dass dafür nochmals eine async Function getValue() erstellt werden muss
Hast Du mit meinem Beispiel auch getan - nur dass diese Funktion anonym ist (also keinen Namen hat).
-
@ticaki sagte in Test SQL-Abfrage:
aber wenn das Skript nicht ganz eingelesen ist, kommt es vor, das Funktionen und Variablen die später als der Aufruf definiert werden, Fehler erzeugen.
Eigentlich nicht - siehe "hoisting"
-
@ticaki sagte: Funktionen und Variablen die später als der Aufruf definiert werden, Fehler erzeugen.
Nur Deklarationen mit const und let müssen vor ihrer Verwendung erfolgen.
Um zusätzlichen Compiler-Durchlauf zu vermeiden, sollten alle Deklarationen vor ihrer Verwendung erfolgen. -
2023-07-26 23:38:23.346 - [31merror[39m: javascript.0 (29336) script.js.Messages.Sensorüberwachung: ReferenceError: Cannot access 'stateDef' before initialization 2023-07-26 23:38:23.347 - [31merror[39m: javascript.0 (29336) at readDP (script.js.Messages.Sensorüberwachung:116:23) 2023-07-26 23:38:23.347 - [31merror[39m: javascript.0 (29336) at work (script.js.Messages.Sensorüberwachung:36:21) 2023-07-26 23:38:23.347 - [31merror[39m: javascript.0 (29336) at init (script.js.Messages.Sensorüberwachung:19:5) 2023-07-26 23:38:23.347 - [31merror[39m: javascript.0 (29336) at script.js.Messages.Sensorüberwachung:107:1 2023-07-26 23:38:23.347 - [31merror[39m: javascript.0 (29336) at script.js.Messages.Sensorüberwachung:167:3 2023-07-26 23:38:23.347 - [31merror[39m: javascript.0 (29336) at Script.runInContext (node:vm:135:12)
Das stand gestern im log, dann hab ich init() ans ende geschoben und alles war gut.
falls es relevant ist:
async function init() { if (!existsState(path)) await createFolderAsync(path, 'Geräteüberwachung') work() return Promise.resolve(true); } const stateDef = { "id": {"type": "string", "def":"", "desc": "diese Id"}, "dp": {"type": "string", "def":"", "desc": "ursprüngliche ID"}, "art": {"type": "string", "def":"ts", "desc": "ts, lc, true, false Worauf geprüft werden soll"},
-
@ticaki sagte in Test SQL-Abfrage:
Das stand gestern im log, dann hab ich init() ans ende geschoben und alles war gut.
Achso, ich dachte es geht um eine Funktions-Deklaration. Daher der Hinweis auf Hoisting.
Da ist natürlich der Hinweis von @paul53 korrekt, dass Du die Variablen mit
const
undlet
vor der Verwendung deklarieren musst. Das ist hier ja nicht passiert (falls Du weiter oben darauf zugreifst - das ist ja sicher nicht das komplette Script?) -
Was gelernt, das müssen hab ich überlesen, fett war es besser zu sehen, jetzt kann ichs genau erklären. Danke
-
@haus-automatisierung sagte in Test SQL-Abfrage:
@roga sagte in Test SQL-Abfrage:
Was mir jedoch daran nicht gefällt ist, dass dafür nochmals eine async Function getValue() erstellt werden muss
Hast Du mit meinem Beispiel auch getan - nur dass diese Funktion anonym ist (also keinen Namen hat).
Oh weh!! Habe ich nicht geschnallt
Aber ja, jetzt wo du es mir erklärt hast, sehe ich das auch.
Ich bin an ein weiteres Problem gestossen, das mir wieder Kopfzerbrechen macht. Ich wollte eigentlich im Hauptprogramm eine globale Variable haben, die den Rückgabewert meiner Funktion enthält und mit der ich überall arbeiten kann. Ich habe mir das sinngemäss zuerst so vorgestellt:
Temperatur = AvarageTimeInterval()
So kannte ich das eigentlich von VBS, das ging dann aber hier leider nicht. Danach habe ich versucht, das neu gelernte anzuwenden:
AvarageTimeInerval().then(function(val) { Temperatur = val; }; Console.log("Temperatur=" + Temperatur);
Ich dachte nun, das muss ja jetzt klappen, aber weit gefehlt
Wieder gab es keinen Wert in der Variable Temperatur und ich fange langsam an, zu verzweifeln. Irgendwo habe ich einen ganz dicken Knoten der nicht aufgehen möchte ....
Kann mir das nochmal jemand vereinfacht erklären was jetzt wieder falsch gelaufen ist, oder muss ich hier die Flinte ins Korn werfen und mir eine andere Beschäftigung suchen????
-
Die Ausführungsreihenfolge in deinem Skript ist so:
1: AvarageTimeInerval().then(function(val) { 3: Temperatur = val; }; 2: Console.log("Temperatur=" + Temperatur);
Wenn du eine Ablaufreihenfolge haben möchtest die jeweils wartet dann am besten imho:
async function main() { Temperatur = await AvarageTimeInerval() Console.log("Temperatur=" + Temperatur); } main()
sehe das nicht als zusätzliche Funktion sondern setzte einfach dein ganzes Skript in die main() funktion, sollte eigentlich problem los funktionieren, solange du sie nicht wiederholt aufrufst.
-
@roga sagte in Test SQL-Abfrage:
und ich fange langsam an, zu verzweifeln. Irgendwo habe ich einen ganz dicken Knoten der nicht aufgehen möchte ....
Der Code in der Callback-Funktion wird später ausgeführt. das läuft asynchron ab! das ist ja der Sinn von Promises. Du musst den Code also umbauen. Nur INNERHALB der Funktion kannst Du das Ergebnis wirklich sicher verwenden. Bitte nochmal mit asynchronem Code beschäftigen. Das restliche Programm läuft weiter, während deine SQL-Abfrage auf ein Ergebnis wartet. Das ist ja der Sinn des Ganzen.
Du sagst quasi nur "hier liebe Funktion, mach mal. Und gib mir mit einem Aufruf in dieser Funktion bescheid, wenn Du fertig bist".
@ticaki hat das ja gut veranschaulicht.