Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [Neu] Diverse async-Funktionen im JavaScript-Adapter

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.2k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.3k

[Neu] Diverse async-Funktionen im JavaScript-Adapter

Scheduled Pinned Locked Moved JavaScript
javascript
39 Posts 12 Posters 8.0k Views 17 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • MicM Offline
    MicM Offline
    Mic
    Developer
    wrote on last edited by Mic
    #1

    Hi,

    muss mal die Werbetrommel rühren :slightly_smiling_face:

    @AlCalzone hat mit Version 4.8.0 (im Latest derzeit 4.8.4) des JavaScript-Adapters async-Funktionen implementiert, das ist wirklich mega :sunglasses:
    (siehe auch Github issue #635)

    182ae54e-6905-47db-8a92-bc9190b82ab1-image.png

    86711280-ed76-4183-8d4b-4b419f8552c4-image.png

    Hier mal ein schnelles Beispiel, es werden nacheinander in einer Schleife 10 States erstellt und dessen Werte dann direkt danach ausgelesen:

    test();
    async function test() {
    
        try {
    
            for (let i = 1; i < 11; i++) {
                const id = `0_userdata.0.async-test.state_${i}`;
                if (await existsStateAsync(id)) {
                    log(`State ${id} already exists`, 'warn');
                } else {
                    await createStateAsync(id, {type:'number', read:true, write:true, def:i });
                    const stateObject = await getStateAsync(id);
                    if (stateObject && stateObject.val) {
                        log(`State '${id}' created, value: '${stateObject.val}'`)
                    } else {
                        log(`Unable to get state value of '${id}'.`, 'error');
                    }
                }
            }
    
        } catch (error) {
            log(`Unexpected error - ${error}`, 'error');
        }
    
    }
    

    Lektüre (Beispiel, ansonsten fragt Google): https://javascript.info/async-await

    async/await macht es wirklich sehr einfach, mit Promises zu arbeiten, eigentlich muss man sich dadurch so gut wie nicht mehr damit beschäftigen ;)
    es vermeidet auch die berüchtigte Callback Hell. async/await und in Verbindung mit try/catch als Error Handling erleichtert euch da echt vieles.

    Ich kann nur empfehlen, dies in euren Scripts zu nutzen, und wenn man später mal selbst einen Adapter entwickeln möchte, ist euer Wissen, dass ihr euch dadurch aneignet, Gold wert.

    F paul53P 2 Replies Last reply
    6
    • MicM Mic

      Hi,

      muss mal die Werbetrommel rühren :slightly_smiling_face:

      @AlCalzone hat mit Version 4.8.0 (im Latest derzeit 4.8.4) des JavaScript-Adapters async-Funktionen implementiert, das ist wirklich mega :sunglasses:
      (siehe auch Github issue #635)

      182ae54e-6905-47db-8a92-bc9190b82ab1-image.png

      86711280-ed76-4183-8d4b-4b419f8552c4-image.png

      Hier mal ein schnelles Beispiel, es werden nacheinander in einer Schleife 10 States erstellt und dessen Werte dann direkt danach ausgelesen:

      test();
      async function test() {
      
          try {
      
              for (let i = 1; i < 11; i++) {
                  const id = `0_userdata.0.async-test.state_${i}`;
                  if (await existsStateAsync(id)) {
                      log(`State ${id} already exists`, 'warn');
                  } else {
                      await createStateAsync(id, {type:'number', read:true, write:true, def:i });
                      const stateObject = await getStateAsync(id);
                      if (stateObject && stateObject.val) {
                          log(`State '${id}' created, value: '${stateObject.val}'`)
                      } else {
                          log(`Unable to get state value of '${id}'.`, 'error');
                      }
                  }
              }
      
          } catch (error) {
              log(`Unexpected error - ${error}`, 'error');
          }
      
      }
      

      Lektüre (Beispiel, ansonsten fragt Google): https://javascript.info/async-await

      async/await macht es wirklich sehr einfach, mit Promises zu arbeiten, eigentlich muss man sich dadurch so gut wie nicht mehr damit beschäftigen ;)
      es vermeidet auch die berüchtigte Callback Hell. async/await und in Verbindung mit try/catch als Error Handling erleichtert euch da echt vieles.

      Ich kann nur empfehlen, dies in euren Scripts zu nutzen, und wenn man später mal selbst einen Adapter entwickeln möchte, ist euer Wissen, dass ihr euch dadurch aneignet, Gold wert.

      F Offline
      F Offline
      fastfoot
      wrote on last edited by
      #2

      @Mic @AlCalzone Schöne Sache:+1: Was mir auffällt, wenn ich i mit 0 starte, erhalte ich immer einen Fehler für den ersten State(der State wird aber richtig erstellt). Starte ich mit einem beliebigen Startwert außer 0, dann erhalte ich nie einen Fehler(nie/immer = ca. je 20 Läufe auf zwei Systemen)

      18:26:11.848	info	javascript.1 (646) script.js.Aktiv.ScriptJS: registered 0 subscriptions and 0 schedules
      18:26:11.995	error	javascript.1 (646) script.js.Aktiv.ScriptJS: Unable to get state value of '0_userdata.0.async-test.state_0'.
      18:26:12.092	info	javascript.1 (646) script.js.Aktiv.ScriptJS: State '0_userdata.0.async-test.state_1' created, value: '1'
      18:26:12.189	info	javascript.1 (646) script.js.Aktiv.ScriptJS: State '0_userdata.0.async-test.state_2' created, value: '2'
      18:26:12.291	info	javascript.1 (646) script.js.Aktiv.ScriptJS: State '0_userdata.0.async-test.state_3' created, value: '3'
      18:26:12.387	info	javascript.1 (646) script.js.Aktiv.ScriptJS: State '0_userdata.0.async-test.state_4' created, value: '4'
      

      iobroker läuft unter Docker auf QNAP TS-451+
      SkriptRecovery: https://forum.iobroker.net/post/930558

      MicM 1 Reply Last reply
      0
      • F fastfoot

        @Mic @AlCalzone Schöne Sache:+1: Was mir auffällt, wenn ich i mit 0 starte, erhalte ich immer einen Fehler für den ersten State(der State wird aber richtig erstellt). Starte ich mit einem beliebigen Startwert außer 0, dann erhalte ich nie einen Fehler(nie/immer = ca. je 20 Läufe auf zwei Systemen)

        18:26:11.848	info	javascript.1 (646) script.js.Aktiv.ScriptJS: registered 0 subscriptions and 0 schedules
        18:26:11.995	error	javascript.1 (646) script.js.Aktiv.ScriptJS: Unable to get state value of '0_userdata.0.async-test.state_0'.
        18:26:12.092	info	javascript.1 (646) script.js.Aktiv.ScriptJS: State '0_userdata.0.async-test.state_1' created, value: '1'
        18:26:12.189	info	javascript.1 (646) script.js.Aktiv.ScriptJS: State '0_userdata.0.async-test.state_2' created, value: '2'
        18:26:12.291	info	javascript.1 (646) script.js.Aktiv.ScriptJS: State '0_userdata.0.async-test.state_3' created, value: '3'
        18:26:12.387	info	javascript.1 (646) script.js.Aktiv.ScriptJS: State '0_userdata.0.async-test.state_4' created, value: '4'
        
        MicM Offline
        MicM Offline
        Mic
        Developer
        wrote on last edited by Mic
        #3

        @fastfoot

        Ist ein Fehler in meinem Beispiel, weil ich die Existenz des State-Wertes mit "!" abfrage, also per falsy, was bei 0 als Statewert false ergibt.
        Ich bessere oben auf die Schnelle nach und starte die Schleife ab 1 ;) Genau so kann man natürlich auch ab 0 starten und anders im if/else darauf abfragen...

        F 1 Reply Last reply
        0
        • MicM Mic

          Hi,

          muss mal die Werbetrommel rühren :slightly_smiling_face:

          @AlCalzone hat mit Version 4.8.0 (im Latest derzeit 4.8.4) des JavaScript-Adapters async-Funktionen implementiert, das ist wirklich mega :sunglasses:
          (siehe auch Github issue #635)

          182ae54e-6905-47db-8a92-bc9190b82ab1-image.png

          86711280-ed76-4183-8d4b-4b419f8552c4-image.png

          Hier mal ein schnelles Beispiel, es werden nacheinander in einer Schleife 10 States erstellt und dessen Werte dann direkt danach ausgelesen:

          test();
          async function test() {
          
              try {
          
                  for (let i = 1; i < 11; i++) {
                      const id = `0_userdata.0.async-test.state_${i}`;
                      if (await existsStateAsync(id)) {
                          log(`State ${id} already exists`, 'warn');
                      } else {
                          await createStateAsync(id, {type:'number', read:true, write:true, def:i });
                          const stateObject = await getStateAsync(id);
                          if (stateObject && stateObject.val) {
                              log(`State '${id}' created, value: '${stateObject.val}'`)
                          } else {
                              log(`Unable to get state value of '${id}'.`, 'error');
                          }
                      }
                  }
          
              } catch (error) {
                  log(`Unexpected error - ${error}`, 'error');
              }
          
          }
          

          Lektüre (Beispiel, ansonsten fragt Google): https://javascript.info/async-await

          async/await macht es wirklich sehr einfach, mit Promises zu arbeiten, eigentlich muss man sich dadurch so gut wie nicht mehr damit beschäftigen ;)
          es vermeidet auch die berüchtigte Callback Hell. async/await und in Verbindung mit try/catch als Error Handling erleichtert euch da echt vieles.

          Ich kann nur empfehlen, dies in euren Scripts zu nutzen, und wenn man später mal selbst einen Adapter entwickeln möchte, ist euer Wissen, dass ihr euch dadurch aneignet, Gold wert.

          paul53P Offline
          paul53P Offline
          paul53
          wrote on last edited by
          #4

          @Mic
          Worin unterscheidet sich die Handhabung von getObjectAsync(id) von getObject(id) ?

          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

          MicM AlCalzoneA 2 Replies Last reply
          0
          • paul53P paul53

            @Mic
            Worin unterscheidet sich die Handhabung von getObjectAsync(id) von getObject(id) ?

            MicM Offline
            MicM Offline
            Mic
            Developer
            wrote on last edited by
            #5

            @paul53 sagte in [Neu] Diverse async-Funktionen im JavaScript-Adapter:

            @Mic
            Worin unterscheidet sich die Handhabung von getObjectAsync(id) von getObject(id) ?

            Hi Paul,

            bei const obj = getObject(id); können wir nicht sicher sein, dass obj in der nächsten Zeile schon gesetzt ist, das wissen wir nur sicher dann im callback von getObject(). Machen wir einige getObject() in einer Schleife z.B., kann das in einer Callback-Hölle enden.

            Mit getObjectAsync(id) viel schöner umzusetzen:

            const obj = await getObjectAsync(id);
            if(!obj) throw(`Hier Fehlertext`);
            // Hier gehts weiter und wir machen was mit 'obj'....
            
            paul53P 1 Reply Last reply
            1
            • paul53P paul53

              @Mic
              Worin unterscheidet sich die Handhabung von getObjectAsync(id) von getObject(id) ?

              AlCalzoneA Offline
              AlCalzoneA Offline
              AlCalzone
              Developer
              wrote on last edited by AlCalzone
              #6

              @paul53 getObjectAsync (und die anderen neuen Funktionen) kapseln den Callback weg. Stattdessen wird der Rückgabewert als Ergebnis von await erhalten und Fehler können klassisch mit try-catch abgefangen werden.

              alt:

              getObject(id, (err, obj) => {
                 // ... mit obj arbeiten oder err behandeln
              });
              // wird sofort ausgeführt
              

              neu:

              try {
                const obj = await getObjectAsync(id);
                // hier mit obj arbeiten
              } catch (err) {
                // hier Fehler behandeln
              }
              

              Außerdem ist das Verhalten von getStateAsync etc. unabhängig davon, ob der Haken "alle States abonnieren" in den Adapter-Einstellungen gesetzt ist. Es gibt nie einen Callback und es ist immer egal, ob die Werte im Hintergrund asynchron geladen werden oder nicht.

              Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

              1 Reply Last reply
              3
              • MicM Mic

                @fastfoot

                Ist ein Fehler in meinem Beispiel, weil ich die Existenz des State-Wertes mit "!" abfrage, also per falsy, was bei 0 als Statewert false ergibt.
                Ich bessere oben auf die Schnelle nach und starte die Schleife ab 1 ;) Genau so kann man natürlich auch ab 0 starten und anders im if/else darauf abfragen...

                F Offline
                F Offline
                fastfoot
                wrote on last edited by
                #7

                @Mic sagte in [Neu] Diverse async-Funktionen im JavaScript-Adapter:

                @fastfoot

                Ist ein Fehler in meinem Beispiel, weil ich die Existenz des State-Wertes mit "!" abfrage, also per falsy, was bei 0 als Statewert false ergibt.
                Ich bessere oben auf die Schnelle nach und starte die Schleife ab 1 ;) Genau so kann man natürlich auch ab 0 starten und anders im if/else darauf abfragen...

                Danke, Anfängerfehler meinerseits, das nicht gesehen zu haben. :disappointed: Andererseits hatte ich es dann doch noch selbst rausgefunden:blush:

                iobroker läuft unter Docker auf QNAP TS-451+
                SkriptRecovery: https://forum.iobroker.net/post/930558

                1 Reply Last reply
                1
                • MicM Mic

                  @paul53 sagte in [Neu] Diverse async-Funktionen im JavaScript-Adapter:

                  @Mic
                  Worin unterscheidet sich die Handhabung von getObjectAsync(id) von getObject(id) ?

                  Hi Paul,

                  bei const obj = getObject(id); können wir nicht sicher sein, dass obj in der nächsten Zeile schon gesetzt ist, das wissen wir nur sicher dann im callback von getObject(). Machen wir einige getObject() in einer Schleife z.B., kann das in einer Callback-Hölle enden.

                  Mit getObjectAsync(id) viel schöner umzusetzen:

                  const obj = await getObjectAsync(id);
                  if(!obj) throw(`Hier Fehlertext`);
                  // Hier gehts weiter und wir machen was mit 'obj'....
                  
                  paul53P Offline
                  paul53P Offline
                  paul53
                  wrote on last edited by
                  #8

                  @Mic sagte:

                  bei const obj = getObject(id); können wir nicht sicher sein, dass obj in der nächsten Zeile schon gesetzt ist

                  getObject(id) arbeitet synchron, indem es auf den Puffer der Javascript-Instanz zugreift. Diese Version funktioniert natürlich nicht mit Haken bei "Nicht alle Zustände beim Start abonnieren".

                  Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                  Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                  AlCalzoneA hanssH 2 Replies Last reply
                  0
                  • paul53P paul53

                    @Mic sagte:

                    bei const obj = getObject(id); können wir nicht sicher sein, dass obj in der nächsten Zeile schon gesetzt ist

                    getObject(id) arbeitet synchron, indem es auf den Puffer der Javascript-Instanz zugreift. Diese Version funktioniert natürlich nicht mit Haken bei "Nicht alle Zustände beim Start abonnieren".

                    AlCalzoneA Offline
                    AlCalzoneA Offline
                    AlCalzone
                    Developer
                    wrote on last edited by
                    #9

                    @paul53 Ja, das Beispiel von @Mic war nicht gut ;) Dennoch ist es bei der Version mit xyzAsync egal, ob der Haken gesetzt ist oder nicht.

                    Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                    1 Reply Last reply
                    1
                    • paul53P paul53

                      @Mic sagte:

                      bei const obj = getObject(id); können wir nicht sicher sein, dass obj in der nächsten Zeile schon gesetzt ist

                      getObject(id) arbeitet synchron, indem es auf den Puffer der Javascript-Instanz zugreift. Diese Version funktioniert natürlich nicht mit Haken bei "Nicht alle Zustände beim Start abonnieren".

                      hanssH Offline
                      hanssH Offline
                      hanss
                      wrote on last edited by
                      #10

                      @paul53 sagte in [Neu] Diverse async-Funktionen im JavaScript-Adapter:

                      getObject

                      Bedeutet das, dass der js adapter zwangsläufig neu gestartet werden muß, wenn sich an den Aufzählungen etwas ändert?

                      1 Reply Last reply
                      0
                      • S Offline
                        S Offline
                        stan23
                        wrote on last edited by stan23
                        #11

                        Hallo,
                        die neuen Möglichkeiten durchdie async-Funktionen hören sich toll an.

                        Nun versuche ich gerade meine alten Callback-Höllen aufzuräumen :)

                        Gibt es einen asynchronen Ersatz für exec oder muss man das mit Promises bauen?

                        function fetchCropPictureMbCam () {
                            return new Promise((resolve) => {
                                cmd = `${wgetCmd} ${picturePathMbCam} ${mailboxCamURL}`;
                                exec(cmd, async function (error, stdout, stderr) {
                                    log(`Exec: ${cmd}`);
                                    log(`Exec: stdout: ${stdout}, stderr: ${stderr}, error: ${error}`);
                                    cmd = `${imageMagickCmd} ${picturePathMbCam} ${imageMagickParams} ${picturePathMbCamCropped}`;
                                    exec(cmd, async function (error, stdout, stderr) {
                                        log(`Exec: ${cmd}`);
                                        log(`Exec: stdout: ${stdout}, stderr: ${stderr}, error: ${error}`);
                                        resolve();
                                    });
                                });
                            });
                        }
                        
                        
                        subscribe({id: dpMailboxFlap, change: "ne", val: 'open'}, async function(obj) {
                            log('Mailbox: Flap has been opened');
                        
                            setState(dpMailboxFillState, eMailboxFillState.filled, true);
                            /* wait 5 seconds so that letters can be thrown in */
                            await wait(5000);
                            await fetchCropPictureMbCam();
                            sendTo('pushover.0', 'send',  {
                                title: 'Briefkasten',
                                message: "Es wurde Post eingeworfen.",
                                file: picturePathMbCamCropped,
                            });
                        });
                        
                        

                        EDIT:
                        ist das so richtig? das resolve() kommt an die Stelle wenn die Callbacks fertig sind?

                        Viele Grüße
                        Marco

                        AlCalzoneA 1 Reply Last reply
                        0
                        • S stan23

                          Hallo,
                          die neuen Möglichkeiten durchdie async-Funktionen hören sich toll an.

                          Nun versuche ich gerade meine alten Callback-Höllen aufzuräumen :)

                          Gibt es einen asynchronen Ersatz für exec oder muss man das mit Promises bauen?

                          function fetchCropPictureMbCam () {
                              return new Promise((resolve) => {
                                  cmd = `${wgetCmd} ${picturePathMbCam} ${mailboxCamURL}`;
                                  exec(cmd, async function (error, stdout, stderr) {
                                      log(`Exec: ${cmd}`);
                                      log(`Exec: stdout: ${stdout}, stderr: ${stderr}, error: ${error}`);
                                      cmd = `${imageMagickCmd} ${picturePathMbCam} ${imageMagickParams} ${picturePathMbCamCropped}`;
                                      exec(cmd, async function (error, stdout, stderr) {
                                          log(`Exec: ${cmd}`);
                                          log(`Exec: stdout: ${stdout}, stderr: ${stderr}, error: ${error}`);
                                          resolve();
                                      });
                                  });
                              });
                          }
                          
                          
                          subscribe({id: dpMailboxFlap, change: "ne", val: 'open'}, async function(obj) {
                              log('Mailbox: Flap has been opened');
                          
                              setState(dpMailboxFillState, eMailboxFillState.filled, true);
                              /* wait 5 seconds so that letters can be thrown in */
                              await wait(5000);
                              await fetchCropPictureMbCam();
                              sendTo('pushover.0', 'send',  {
                                  title: 'Briefkasten',
                                  message: "Es wurde Post eingeworfen.",
                                  file: picturePathMbCamCropped,
                              });
                          });
                          
                          

                          EDIT:
                          ist das so richtig? das resolve() kommt an die Stelle wenn die Callbacks fertig sind?

                          AlCalzoneA Offline
                          AlCalzoneA Offline
                          AlCalzone
                          Developer
                          wrote on last edited by
                          #12

                          @stan23 Für exec gibts tatsächlich keinen Ersatz, weil das Rückgabeobjekt nicht ganz eindeutig wäre.
                          Dein Code ist so fast korrekt:

                          • async vor den functions in fetchCropPictureMbCam ist unnötig, da du darin kein await verwendest
                          • cmd wird nirgends deklariert.

                          Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                          S N 2 Replies Last reply
                          0
                          • AlCalzoneA AlCalzone

                            @stan23 Für exec gibts tatsächlich keinen Ersatz, weil das Rückgabeobjekt nicht ganz eindeutig wäre.
                            Dein Code ist so fast korrekt:

                            • async vor den functions in fetchCropPictureMbCam ist unnötig, da du darin kein await verwendest
                            • cmd wird nirgends deklariert.
                            S Offline
                            S Offline
                            stan23
                            wrote on last edited by
                            #13

                            @AlCalzone said in [Neu] Diverse async-Funktionen im JavaScript-Adapter:

                            Dein Code ist so fast korrekt:

                            • async vor den functions in fetchCropPictureMbCam ist unnötig, da du darin kein await verwendest
                            • cmd wird nirgends deklariert.

                            Stimmt, das Erste ist ein Relikt aus meinen Versuchen, das Zweite war noch global deklariert.
                            Habe ich beides geändert und funktioniert.
                            Vielen Dank!

                            Gibt es denn beim setState auch etwas zu beachten?
                            Ich hatte mir vor langer Zeit mal gemerkt dass man für HomeMatic die Einschaltdauer und den tatsächlichen Schaltbefehl so setzen soll:

                            setState("hm-rpc.2.NEQ0115240.1.ON_TIME", 2*3600, function() {
                                setState("hm-rpc.2.NEQ0115240.1.STATE", true);
                            });
                            

                            Ist das noch okay oder gibt es da auch eine komfortablere Variante? Oder einfach 2 setState hintereinander weil die sich nicht überholen können?

                            Viele Grüße
                            Marco

                            AlCalzoneA 1 Reply Last reply
                            0
                            • S stan23

                              @AlCalzone said in [Neu] Diverse async-Funktionen im JavaScript-Adapter:

                              Dein Code ist so fast korrekt:

                              • async vor den functions in fetchCropPictureMbCam ist unnötig, da du darin kein await verwendest
                              • cmd wird nirgends deklariert.

                              Stimmt, das Erste ist ein Relikt aus meinen Versuchen, das Zweite war noch global deklariert.
                              Habe ich beides geändert und funktioniert.
                              Vielen Dank!

                              Gibt es denn beim setState auch etwas zu beachten?
                              Ich hatte mir vor langer Zeit mal gemerkt dass man für HomeMatic die Einschaltdauer und den tatsächlichen Schaltbefehl so setzen soll:

                              setState("hm-rpc.2.NEQ0115240.1.ON_TIME", 2*3600, function() {
                                  setState("hm-rpc.2.NEQ0115240.1.STATE", true);
                              });
                              

                              Ist das noch okay oder gibt es da auch eine komfortablere Variante? Oder einfach 2 setState hintereinander weil die sich nicht überholen können?

                              AlCalzoneA Offline
                              AlCalzoneA Offline
                              AlCalzone
                              Developer
                              wrote on last edited by
                              #14

                              @stan23 sagte in [Neu] Diverse async-Funktionen im JavaScript-Adapter:

                              Oder einfach 2 setState hintereinander weil die sich nicht überholen können?

                              Eine "komfortablere" Variante für zwei getrennte States gibt es nicht. Mit await setStateAsync(...) kannst du sie aber einfach unterenander hängen, weil die sich nicht überholen (im Gegensatz zu setState, wo du einen callback brauchst)

                              Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                              S 1 Reply Last reply
                              1
                              • AlCalzoneA AlCalzone

                                @stan23 sagte in [Neu] Diverse async-Funktionen im JavaScript-Adapter:

                                Oder einfach 2 setState hintereinander weil die sich nicht überholen können?

                                Eine "komfortablere" Variante für zwei getrennte States gibt es nicht. Mit await setStateAsync(...) kannst du sie aber einfach unterenander hängen, weil die sich nicht überholen (im Gegensatz zu setState, wo du einen callback brauchst)

                                S Offline
                                S Offline
                                stan23
                                wrote on last edited by
                                #15

                                @AlCalzone das finde ich komfortabel genug :)

                                Viele Grüße
                                Marco

                                1 Reply Last reply
                                0
                                • AlCalzoneA AlCalzone

                                  @stan23 Für exec gibts tatsächlich keinen Ersatz, weil das Rückgabeobjekt nicht ganz eindeutig wäre.
                                  Dein Code ist so fast korrekt:

                                  • async vor den functions in fetchCropPictureMbCam ist unnötig, da du darin kein await verwendest
                                  • cmd wird nirgends deklariert.
                                  N Offline
                                  N Offline
                                  noox
                                  wrote on last edited by
                                  #16

                                  @AlCalzone
                                  Gibt es auch eine Lösung für einen async HTTP-Request? Oder soll man es am besten noch ähnlich wie das stan23 für exec gemacht hat lösen?

                                  Ich vermute mal, dass die request-Funktion von ioBroker auf das Node-Modul "request" aufbaut? Stimmt das? Das ist scheinbar auch seit Februar "deprecated": https://www.npmjs.com/package/request

                                  N AlCalzoneA 2 Replies Last reply
                                  0
                                  • N noox

                                    @AlCalzone
                                    Gibt es auch eine Lösung für einen async HTTP-Request? Oder soll man es am besten noch ähnlich wie das stan23 für exec gemacht hat lösen?

                                    Ich vermute mal, dass die request-Funktion von ioBroker auf das Node-Modul "request" aufbaut? Stimmt das? Das ist scheinbar auch seit Februar "deprecated": https://www.npmjs.com/package/request

                                    N Offline
                                    N Offline
                                    Nahasapee
                                    wrote on last edited by
                                    #17

                                    @noox hi ich hab das thema bei mir so gelöst:

                                    https://github.com/Nahasapeemapetilon/MyTelegramMenu/blob/f2effab433a419e7f04967c319dd636f7a08e4cc/lib/googlepolling.js#L91

                                    und hier der wait

                                    https://github.com/Nahasapeemapetilon/MyTelegramMenu/blob/f2effab433a419e7f04967c319dd636f7a08e4cc/lib/googlepolling.js#L110

                                    viele grüße

                                    1 Reply Last reply
                                    1
                                    • N noox

                                      @AlCalzone
                                      Gibt es auch eine Lösung für einen async HTTP-Request? Oder soll man es am besten noch ähnlich wie das stan23 für exec gemacht hat lösen?

                                      Ich vermute mal, dass die request-Funktion von ioBroker auf das Node-Modul "request" aufbaut? Stimmt das? Das ist scheinbar auch seit Februar "deprecated": https://www.npmjs.com/package/request

                                      AlCalzoneA Offline
                                      AlCalzoneA Offline
                                      AlCalzone
                                      Developer
                                      wrote on last edited by
                                      #18

                                      @noox sagte in [Neu] Diverse async-Funktionen im JavaScript-Adapter:

                                      Gibt es auch eine Lösung für einen async HTTP-Request?

                                      Entweder so wie mein Vorposter.
                                      Alternativ ginge z.b. die u.a. von mir bevorzugte Library https://github.com/axios/axios - die Beispiele dort sind mit Promises und .then geschrieben, lassen sich aber selbstverständlich auch mit await nutzen

                                      Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                                      N P 2 Replies Last reply
                                      1
                                      • AlCalzoneA AlCalzone

                                        @noox sagte in [Neu] Diverse async-Funktionen im JavaScript-Adapter:

                                        Gibt es auch eine Lösung für einen async HTTP-Request?

                                        Entweder so wie mein Vorposter.
                                        Alternativ ginge z.b. die u.a. von mir bevorzugte Library https://github.com/axios/axios - die Beispiele dort sind mit Promises und .then geschrieben, lassen sich aber selbstverständlich auch mit await nutzen

                                        N Offline
                                        N Offline
                                        noox
                                        wrote on last edited by
                                        #19

                                        @Nahasapee, @AlCalzone Vielen Dank!
                                        Mit Axios geht das echt easy.

                                        Erster Versuch für simples Get mit JSON-Response in Typescript:

                                        const axios = require('axios').default;
                                        
                                        class ... { 
                                        
                                            public static async httpGetRequestJson(url: string, throwException: boolean = false): Promise<any> {
                                                let response: any;
                                                try {
                                                    response = await axios.get(url, {
                                                        timeout: 10000,
                                                    });
                                                } catch(exception) {
                                                    log(`error fetching url ${url}: ${JSON.stringify(exception)}`, 'error');
                                                    if(throwException) throw exception;
                                                    return undefined;
                                                }
                                                if(response.status != 200) {
                                                    log(`error fetching url ${url}. Status: ${response.status} ${response.statusText}. Response: ${JSON.stringify(response)}`, 'error');
                                                    if(throwException) throw new Error(`Response status: ${response.status} ${response.statusText}.`);
                                                    return undefined;            
                                                }
                                                // log(response.data);
                                                return response.data;
                                            }
                                        
                                        }
                                        

                                        Hier wurde das Thema eh auch schon aufgegriffen - hatte es aber erst jetzt (wegen dem Hinweis auf Axios) gefunden: https://forum.iobroker.net/topic/36039/alternative-für-request-paket

                                        PS: Wer sich den response komplett ansehen möchte: Bei wir waren da zirkuläre Referencen drinnen, sodass JSON.stringify nicht funktionierte. Auf Stackoverflow gibt's ein paar Diskussionen dazu. Ein Workaround z.B. hier: https://stackoverflow.com/a/48845206

                                        1 Reply Last reply
                                        0
                                        • AlCalzoneA AlCalzone

                                          @noox sagte in [Neu] Diverse async-Funktionen im JavaScript-Adapter:

                                          Gibt es auch eine Lösung für einen async HTTP-Request?

                                          Entweder so wie mein Vorposter.
                                          Alternativ ginge z.b. die u.a. von mir bevorzugte Library https://github.com/axios/axios - die Beispiele dort sind mit Promises und .then geschrieben, lassen sich aber selbstverständlich auch mit await nutzen

                                          P Offline
                                          P Offline
                                          Pittini
                                          Developer
                                          wrote on last edited by
                                          #20

                                          @AlCalzone sagte in [Neu] Diverse async-Funktionen im JavaScript-Adapter:

                                          @noox sagte in [Neu] Diverse async-Funktionen im JavaScript-Adapter:

                                          Gibt es auch eine Lösung für einen async HTTP-Request?

                                          Entweder so wie mein Vorposter.
                                          Alternativ ginge z.b. die u.a. von mir bevorzugte Library https://github.com/axios/axios - die Beispiele dort sind mit Promises und .then geschrieben, lassen sich aber selbstverständlich auch mit await nutzen

                                          Ich stell mich leider mal wieder zu doof an, ich hab das Beispiel von Axios versucht umzusetzen, aber da kommt immer nurn leeres Objekt. Hat da evtl jemand nen Beispiel was läuft? Oder kann mir sagen was da verkehrt ist (ich und Objekte werden einfach keine Freunde mehr)?

                                          const axios = require('axios');
                                          
                                          getData();
                                          async function getData() {
                                            try {
                                              const response = await axios.get('https://miot-spec.org/miot-spec-v2/instance?type=urn:miot-spec-v2:device:air-purifier:0000A007:zhimi-ma4:1',{timeout : 10000});
                                              console.log("resp:"+JSON.stringify( response));
                                            } catch (error) {
                                              console.error(error);
                                            }
                                          }
                                          
                                          N F 2 Replies Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          436

                                          Online

                                          32.4k

                                          Users

                                          81.4k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Home
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe