Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Rückgabewert von async Function festlegen

    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

    Rückgabewert von async Function festlegen

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

      Vorweg: Ich stehe mit Promises und Async noch etwas auf Kriegsfuß, verzeiht bitte Anfängerfehler.

      Ich habe folgende Funktion:

      async function CreateIfNotExistsStringAsync(Datenpunkt="", InitValue="", Klarname=""){
          if (Datenpunkt.search("javascript.0.Verbrauch.") != 0){
              Datenpunkt = "javascript.0.Verbrauch." + Datenpunkt;
          }
          return new Promise(async (resolve,reject)=>{
              if (!existsState(Datenpunkt)){
                  await createStateAsync(Datenpunkt, InitValue, {type: "string",name: Klarname, read: true,write: true,role: "value", unit: ""});
              }
              return resolve(Datenpunkt);
          });
       }
      
      

      mein Ziel ist es, mit

      const VerbraucherDP = await CreateIfNotExistsStringAsync("Stromverbrauch.Verbraucher", "", "Letzte Verbraucher Datei");
      

      VerbraucherDP den Wert "javascript.0.Verbrauch.Stromverbrauch.Verbraucher" zuzuweisen. Das funktioniert auch.

      wenn ich aber

      setState(VerbraucherDP, "Hallo");
      

      schreibe funktioniert das zwar auch, aber im Quelltext ist "VerbrauherDP" unterkringelt und als Hinweis kommt "No overload matches this call.", wenn ich mit der Maus über VerbraucherDP gehe kommt: "const VerbraucherDP: unknown".
      Ich hätte jetzt eigentlich erwartet, dass durch die Funktionsdeklaration

      async function CreateIfNotExistsStringAsync(Datenpunkt="", InitValue="", Klarname=""){
      

      der Rückgabewert als String festgelgt ist - ist er aber scheinbar nicht. Wie lege ich den Rückgabewert als String fest? Ein toString() im return Teil tut auch nicht.

      Codierknecht Acgua 2 Replies Last reply Reply Quote 0
      • Codierknecht
        Codierknecht Developer Most Active @WolfgangFB last edited by

        @wolfgangfb sagte in Rückgabewert von async Function festlegen:

        Wie lege ich den Rückgabewert als String fest?

        In einer nicht typisierten Sprache?

        @wolfgangfb sagte in Rückgabewert von async Function festlegen:

        Ein toString() im return Teil tut auch nicht.

        Würde ich - nach meinem Verständnis - allerdings erwarten.

        Ich lese dann mal interessiert mit ...

        1 Reply Last reply Reply Quote 0
        • Acgua
          Acgua @WolfgangFB last edited by

          @wolfgangfb said in Rückgabewert von async Function festlegen:

          Ich habe folgende Funktion:

          Promise brauchst du da nicht. ioBroker bietet ja bereits diverse async-Funktionen.
          Folgende abgewandelte Funktion gibt den Datenpunkt als String zurück, oder bei Fehler ein leeres String.

          async function CreateIfNotExistsStringAsync2(Datenpunkt="", InitValue="", Klarname=""){
              try {
                  if (! Datenpunkt.startsWith("javascript.0.Verbrauch.")){
                          Datenpunkt = "javascript.0.Verbrauch." + Datenpunkt;
                  }
          
                  if (! (await existsStateAsync(Datenpunkt))){
                      await createStateAsync(Datenpunkt, InitValue, {type: "string", name: Klarname, read: true, write: true, role: "value"});
                  }
                  return Datenpunkt;
          
          
              } catch (error) {
                  log(error.stack, 'error');
                  return '';
              }
          }
          

          Wobei createStateAsync() einen Parameter forceCreation mitbringt, den auf false gesetzt, dann kann man sich die vorherige Abfrage mit existsState sparen. https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#createstate

          Übrigens:
          Typen kannst du schöner in TypeScript definieren, erste Zeile in TypeScrypt wäre:

          async function CreateIfNotExistsStringAsync2(Datenpunkt: string, InitValue: string, Klarname: string): Promise<string> {
          

          Das Promise<string> sagt hierbei aus, dass als Rückgabewert ein String erwartet wird.

          Dies nur in kürze, sag gerne Bescheid, wenn du detaillierte Hilfestellungen oder Infos brauchst.

          W 1 Reply Last reply Reply Quote 0
          • W
            WolfgangFB @Acgua last edited by

            @acgua sagte in Rückgabewert von async Function festlegen:

            @wolfgangfb said in Rückgabewert von async Function festlegen:

            Ich habe folgende Funktion:

            Promise brauchst du da nicht. ioBroker bietet ja bereits diverse async-Funktionen.
            Folgende abgewandelte Funktion gibt den Datenpunkt als String zurück, oder bei Fehler ein leeres String.

            Danke erstmal, schaue ich mir später richtig an.
            Mich würde aber doch interessieren (ich will ja lernen :-), wie ich es in meinem Konstrukt mache, dass der Rückgabetyp richtig gesetzt ist.

            Acgua F 2 Replies Last reply Reply Quote 0
            • Acgua
              Acgua @WolfgangFB last edited by

              @wolfgangfb said in Rückgabewert von async Function festlegen:

              Mich würde aber doch interessieren (ich will ja lernen :-), wie ich es in meinem Konstrukt mache, dass der Rückgabetyp richtig gesetzt ist.

              Hast du soweit schon richtig gemacht, also im resolve() das String zurückgeben.

              @wolfgangfb said in Rückgabewert von async Function festlegen:

              aber im Quelltext ist "VerbrauherDP" unterkringelt und als Hinweis kommt "No overload matches this call."

              Bei mir ist nichts unterkringelt, liegt wohl am JS-Adapter (Version, Browsercache, etc.) und in wie fern der Editor tatsächlich immer alles korrekt erkennt.

              Was noch auffällt: existsState() ist nicht async, daher in meinem Beispiel durch existsStateAsync() ersetzt.

              1 Reply Last reply Reply Quote 0
              • F
                fastfoot @WolfgangFB last edited by fastfoot

                @wolfgangfb sagte in Rückgabewert von async Function festlegen:

                dass der Rückgabetyp richtig gesetzt ist.

                Die Kringel im Editor sagen nicht aus ob etwas richtig oder falsch ist, sie geben 'nur' einen Hinweis dass etwas falsch sein könnte. Dazu werden xxxxx.d.ts Dateien genutzt in welchen die Funktionen in TypeScript Notation definiert werden. Für den JS-Adapter ist das die javascript.d.ts Datei. Dort ist der Parameter für die setState() Funktion als string definiert. Für Deine Funktion ist jedoch nicht bekannt welchen Typ sie zurückgibt, somit ist dem Editor nicht bekannt dass ein String übergeben wird und er kringelt dann halt

                Um die Kringel zu unterbinden (nicht empfohlen bzw. nur wenn man weiss was man tut)

                • Ganz zu Beginn deines Skripts // @ts-nocheck eingeben. Dadurch werden die Hinweise für die gesamte Datei abgeschaltet.
                • Unmittelbar über einer Zeile mit Kringeln // @ts-ignore eingeben. Dadurch wird der Hinweis für die nächste Zeile verhindert.

                xxxxx.d.ts Dateien funktionieren im JS-Adapter m.W. nach nicht. Man kann Funktionen und auch Variablen mit JSDoc ausstatten, dann funktionieren die Hinweise genauso und man könnte auch eine Doku davon erstellen(Google JSDoc)

                /** 
                 * Funktion zur Ermittlung und Erstellung eines Datenpunkts
                 * 
                 * @param {string} Datenpunkt der Datenpunkt
                 * @param {string} InitValue Initialwert
                 * @param {string} Klarname der Name des DP
                 * @returns {Promise<string>} gibt ein Promise zurück
                */
                async function CreateIfNotExistsStringAsync(Datenpunkt, InitValue, Klarname) {
                
                1 Reply Last reply Reply Quote 0
                • First post
                  Last post

                Support us

                ioBroker
                Community Adapters
                Donate

                463
                Online

                31.8k
                Users

                80.0k
                Topics

                1.3m
                Posts

                4
                6
                294
                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