NEWS
[gelöst] Funktionsrückgabe undefined
-
Hallo Zusammen,
irgendwie verstehe ich wohl nicht wo und wie mit async, await und/oder promises gearbeitet werden muss und hoffe auf hilfe
Habe folgende Funktion
function tibberprice_holen(t){ var tibberprice = 0; console.log(t); // Aktuellen Tibber Preis holen innerhalb der Callback-Funktion: let search_Std = t.toString().substring(0, 18); console.log(search_Std); try{ id_SrcTibberpreise.each(async function(id) { // im Verzeichnis der Tibberpreise suchen im gültig ab Zeitdatenpunkt if(getState(id).val.substring(0, 18) == search_Std) { tibberprice = getState(id.replace('startTime', 'Total_Preis')).val; console.log(tibberprice); return ; }}); } catch(error) {} // wegen fehlender Werte für den Folgetag in der Zeit von 00 - 14 Uhr } console.log('Fertig : ' +tibberprice_holen(new Date()));
wenn das Programm läuft zeigt es durch die Logs innerhalb der Funktion den richtigen Wert
nur ausserhalb im Log kommt undefined -
@ostseeskipper auf den ersten Blick würde ich sagen das du bei return noch angeben musst welchen Wert er denn zurück geben soll. Woher soll er das sonst wissen? Also „return tibberprice“
Und wenn du eine Funktion mit async deklarierst solltest du innerhalb dieser auch async Funktionen nutzen. Also await getStateAsync(id.replace('startTime', 'Total_Preis')).val; Ist hier nun nicht schlimm und wenn nicht kannst auch das async weg lassen. Aber bei mehreren Werten die man holen möchte macht das dann schon Sinn damit ggf. nicht übersprungen wird.
-
@ciddi89
Hatte ich bereits probiert genau zu sagen "return tibberprice"
auch await hilft nichtfunction tibberprice_holen(t){ // wenn Funktion geht und wert zurück liefert var tibberprice = 0; console.log(t); // Aktuellen Tibber Preis holen innerhalb der Callback-Funktion: let search_Std = t.toString().substring(0, 18); console.log(search_Std); try{ id_SrcTibberpreise.each(async function(id) { // im Verzeichnis der Tibberpreise suchen im gültig ab Zeitdatenpunkt if(getState(id).val.substring(0, 18) == search_Std) { tibberprice = await Math.round(getState(id.replace('startTime', 'Total_Preis')).val*100)/10000; console.log(tibberprice); return tibberprice ; }}); } catch(error) {} // wegen fehlender Werte für den Folgetag in der Zeit von 00 - 14 Uhr } console.log('Fertig : ' +tibberprice_holen(new Date()));
ergibt
19:26:37.080 info javascript.0 (18691) script.js.Z_Test.Test_Zaehlerstaende: Sun Apr 23 2023 19:26:37 GMT+0200 (Mitteleuropäische Sommerzeit) 19:26:37.080 info javascript.0 (18691) script.js.Z_Test.Test_Zaehlerstaende: Sun Apr 23 2023 19 19:26:37.080 info javascript.0 (18691) script.js.Z_Test.Test_Zaehlerstaende: Fertig : undefined
und wenn funktion mit async definiert wird kommt
19:27:41.412 info javascript.0 (18691) script.js.Z_Test.Test_Zaehlerstaende: Sun Apr 23 2023 19:27:41 GMT+0200 (Mitteleuropäische Sommerzeit) 19:27:41.412 info javascript.0 (18691) script.js.Z_Test.Test_Zaehlerstaende: Sun Apr 23 2023 19 19:27:41.412 info javascript.0 (18691) script.js.Z_Test.Test_Zaehlerstaende: Fertig : [object Promise]
Daher wird es irgendwas sein was ich noch nicht verstanden habe und hoffe auf das Wissen hier im Forum
-
@ostseeskipper erstmal das
await
for Math.round hat keinen Effekt. Du musst wenn schon await vor dasgetState
setzen. dann heisst es aberawait getStateAsync
Aber woher holt er zb. den Wert?
id_SrcTibberpreise
Ist da noch mehr im script? Deswegen gibt er wahrscheinlich nichts zurück weil er mit der id nichts anfangen kann und somit aus der Funktion springt.Hier aber erstmal wie es mit den await aussehen sollte/könnte:
function tibberprice_holen(t){ // wenn Funktion geht und wert zurück liefert let tibberprice = 0; console.log(t); // Aktuellen Tibber Preis holen innerhalb der Callback-Funktion: let search_Std = t.toString().substring(0, 18); console.log(search_Std); try{ id_SrcTibberpreise.each(async function(id) { // im Verzeichnis der Tibberpreise suchen im gültig ab Zeitdatenpunkt if(getState(id).val.substring(0, 18) == search_Std) { tibberprice = Math.round((await getStateAsync(id.replace('startTime','Total_Preis'))).val*100)/10000; console.log(tibberprice); return tibberprice; }}); } catch(error) { console.warn(error.message) } // wegen fehlender Werte für den Folgetag in der Zeit von 00 - 14 Uhr } const actualTibberprice = tibberprice_holen(new Date()); console.log('Fertig : ' + actualTibberprice);
// EDIT: wird einem auch gesagt wenn du im error fall eine log ausgabe gibt. Hab das Script damit auch noch angepasst.
19:51:28.618 warn javascript.0 (539) script.js.Vorlagen.212: id_SrcTibberpreise is not defined
-
@ostseeskipper sagte: ausserhalb im Log kommt undefined
Man muss den Rückgabewert in der äußeren Funktion mitgeben:
function tibberprice_holen(t){ var tibberprice = 0; console.log(t); // Aktuellen Tibber Preis holen innerhalb der Callback-Funktion: let search_Std = t.toString().substring(0, 18); console.log(search_Std); try { id_SrcTibberpreise.each(function(id) { // im Verzeichnis der Tibberpreise suchen im gültig ab Zeitdatenpunkt if(getState(id).val.substring(0, 18) == search_Std) { tibberprice = getState(id.replace('startTime', 'Total_Preis')).val; console.log(tibberprice); return; } }); return tibberprice; } catch(error) {} // wegen fehlender Werte für den Folgetag in der Zeit von 00 - 14 Uhr } console.log('Fertig : ' +tibberprice_holen(new Date()));
-
@paul53 wie immer besten Dank
echt klasse wie du hier mit deinem Wissen hilfst und unterstützt.
Hast du ne Kaffeekasse?