NEWS
Bitte um Sample Code für "sendToAsync"
-
Hallo
Ich möchte die neue Funktion "sendToAsync" nutzen, um eine InfluxDB query durchzuführen.
So habe ich das bisher realisiert mit selbst gebautem promise.async function sum(id,timestart,timeend,db) { //workarround to adjust Timezone Differenz to UTC var end = new Date(timeend).getTime()*1000000 var start = new Date(timestart).getTime()*1000000 var sum = 0 var query = 'SELECT sum("value") FROM "autogen"."' + id +'" WHERE time >= ' + start + ' AND time <= ' + end const abfrage = new Promise(function(resolve, error) { sendTo(db, 'query', query, function (result) { if (result.error) {console.error(result.error); } else { if (result.result[0][0] != undefined) sum = result.result[0][0].sum resolve(true) } } ) }) await abfrage return sum; }
Dann habe ich versucht, die neue Funktion zu nutzen und bekomme einen Javascript "termination".
async function sum2(id,timestart,timeend,db) { //workarround to adjust Timezone Differenz to UTC var end = new Date(timeend).getTime()*1000000 var start = new Date(timestart).getTime()*1000000 var sum = 0 var result = {} var query = 'SELECT sum("value") FROM "autogen"."' + id +'" WHERE time >= ' + start + ' AND time <= ' + end result = await sendToAsync(db, 'query', query) if (result.error) {console.error(result.error); } else { if (result.result[0][0] != undefined) sum = result.result[0][0].sum //log('Summme von DB:' + db + ' id:'+ id + " Summe: " + sum + " von: " + timestart + " bis: " + timeend) } return sum; } (async () => { log("" + await sum2(path2db + 'Auto_Ex.Tag_Energie',firstdayofyear + seach_time_start,yesterday +seach_time_end ,endless)) })();
Der Javascript Adapter stürzt ab mit folgender Fehlermeldung
2022-11-23 10:30:27.581 error undefined javascript.0 2022-11-23 10:30:27.581 error unhandled promise rejection: undefined javascript.0 2022-11-23 10:30:27.581 error Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().
Was mache ich falsch?
-
@marty56
die Funktion wirft einen Fehler.
Die Async Versionen der Funktionen geben primär ein Promise zurück.
Der Befehl await hilft dem Programmierer dabei, simpler mit dem promise umzugehen. Allerdings nur wenn alles gut verläuft. Wirft das promise ein reject (also ein Fehler ist im Befehl aufgetaucht, dann muss man den mit try/catch abfangenhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise?retiredLocale=de
Version 1: Klassischer Umgang mit PromisesendToAsync(db, 'query', query).then({ //Funktionsteil wenn ohne Fehler },{ //Funktionsteil wenn mit Fehler }
Version 2: Fehler bei Promis mit Await mit try/catch Anweisung
try { result = await sendToAsync(db, 'query', query); ... weitere Abarbeitung im Gutfall } catch(err) { //Im Fehlerfall }
Version 3: Fehler bei Promise mit Await und catch-Funktion
result = await sendToAsync(db, 'query', query).catch((err=>{ //Im Fehlerfall }); ... weitere Abarbeitung im Gutfall
-
@oliverio Danke für die Antwort.
Ich habe deinen Vorschlag ausprobiert und glaube jetzt, dass die Funktion "sendToAsync" noch buggy ist.
Es wird nämlich immer einen Fehler ausgelöst, auch wenn ein korrektes Ergebnis vorliegt.
Und wenn ich dann den Inhalt des Fehler anschaue, wird das korrekte Ergebnis als Fehlerursache angezeigt.async function sum2(id,timestart,timeend,db) { //workarround to adjust Timezone Differenz to UTC var end = new Date(timeend).getTime()*1000000 var start = new Date(timestart).getTime()*1000000 var sum = 0 var result ={} var return_value var query = 'SELECT sum("value") FROM "autogen"."' + id +'" WHERE time >= ' + start + ' AND time <= ' + end try { return_value = await sendToAsync(db, 'query', query); log("Return" + JSON.stringify(return_value)) } catch (error) { console.error(error) } return sum; }
liefert im Log
error script.js.common.Energie: {'result':[[{'sum':1333.9444199999998,'ts':1640991600000}]],'ts':1669200179686,'error':null}
Ich mache mal ein Issue auf.
-
https://github.com/ioBroker/ioBroker.javascript/issues/1198
Ich glaube, dass ich auch den Bug gefunden habe.