Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Bitte um Sample Code für "sendToAsync"

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Bitte um Sample Code für "sendToAsync"

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      Marty56 last edited by

      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?

      OliverIO 1 Reply Last reply Reply Quote 0
      • OliverIO
        OliverIO @Marty56 last edited by

        @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 abfangen

        https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise?retiredLocale=de
        Version 1: Klassischer Umgang mit Promise

        sendToAsync(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
        
        M 1 Reply Last reply Reply Quote 0
        • M
          Marty56 @OliverIO last edited by Marty56

          @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.

          M 1 Reply Last reply Reply Quote 1
          • M
            Marty56 @Marty56 last edited by

            https://github.com/ioBroker/ioBroker.javascript/issues/1198

            Ich glaube, dass ich auch den Bug gefunden habe.

            Marty56 created this issue in ioBroker/ioBroker.javascript

            closed sendToAsync always returns error state #1198

            1 Reply Last reply Reply Quote 1
            • First post
              Last post

            Support us

            ioBroker
            Community Adapters
            Donate

            663
            Online

            31.8k
            Users

            80.0k
            Topics

            1.3m
            Posts

            javascript
            2
            4
            401
            Loading More Posts
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes
            Reply
            • Reply as topic
            Log in to reply
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
            The ioBroker Community 2014-2023
            logo