Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

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

NEWS

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    11
    1
    543

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.7k

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

[Neu] Diverse async-Funktionen im JavaScript-Adapter

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
39 Beiträge 12 Kommentatoren 8.6k Aufrufe 17 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • 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
    schrieb am zuletzt editiert von
    #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 Antworten Letzte Antwort
    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
      schrieb am zuletzt editiert von
      #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 Antwort Letzte Antwort
      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
        schrieb am zuletzt editiert von
        #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 Antwort Letzte Antwort
        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
          schrieb am zuletzt editiert von
          #15

          @AlCalzone das finde ich komfortabel genug :)

          Viele Grüße
          Marco

          1 Antwort Letzte Antwort
          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
            schrieb am zuletzt editiert von
            #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 Antworten Letzte Antwort
            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
              schrieb am zuletzt editiert von
              #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 Antwort Letzte Antwort
              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
                schrieb am zuletzt editiert von
                #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 Antworten Letzte Antwort
                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
                  schrieb am zuletzt editiert von
                  #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 Antwort Letzte Antwort
                  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
                    schrieb am zuletzt editiert von
                    #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 Antworten Letzte Antwort
                    0
                    • P Pittini

                      @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 Offline
                      N Offline
                      noox
                      schrieb am zuletzt editiert von noox
                      #21

                      @Pittini
                      JSON.stringify funktioniert eventuell nicht auf response, weil hier zirkuläre Referenzen drinnen sind. Siehe meinen Stackoverflow-Link von oben. Aber der Fehler müsste dann im catch() geloggt werden.

                      Probier mal z.B. nur response.status, response.data, etc.

                      1 Antwort Letzte Antwort
                      0
                      • zaunermaxZ Offline
                        zaunermaxZ Offline
                        zaunermax
                        schrieb am zuletzt editiert von
                        #22

                        Mega nice, ich werde gleich alle meine synchronen calls auswechseln. Ich hab sogar vorher einen primitiven Promise wrapper gehabt, aber nativ das ganze zu haben ist sehr geil :raised_hands:

                        1 Antwort Letzte Antwort
                        0
                        • P Pittini

                          @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);
                            }
                          }
                          
                          F Offline
                          F Offline
                          fastfoot
                          schrieb am zuletzt editiert von
                          #23

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

                          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)?

                          wie schön, wenn man mal nicht der einzige 'Doofe' ist :-) Dein Beispiel läuft bereits perfekt, wenn du JSON.stringify(response.data) nimmst. Das was sonst noch so drin steht findest du mit Object.keys(response) raus, welche du dann alle mit JSON.stringify() untersuchen kannst

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

                          P 1 Antwort Letzte Antwort
                          2
                          • F fastfoot

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

                            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)?

                            wie schön, wenn man mal nicht der einzige 'Doofe' ist :-) Dein Beispiel läuft bereits perfekt, wenn du JSON.stringify(response.data) nimmst. Das was sonst noch so drin steht findest du mit Object.keys(response) raus, welche du dann alle mit JSON.stringify() untersuchen kannst

                            P Offline
                            P Offline
                            Pittini
                            Developer
                            schrieb am zuletzt editiert von
                            #24

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

                            wie schön, wenn man mal nicht der einzige 'Doofe' ist Dein Beispiel läuft bereits perfekt, wenn du JSON.stringify(response.data) nimmst. Das was sonst noch so drin steht findest du mit Object.keys(response) raus, welche du dann alle mit JSON.stringify() untersuchen kannst

                            Wow, so einfach. Danke! Ich geh jetzt in die Ecke schämen.

                            N 1 Antwort Letzte Antwort
                            0
                            • P Pittini

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

                              wie schön, wenn man mal nicht der einzige 'Doofe' ist Dein Beispiel läuft bereits perfekt, wenn du JSON.stringify(response.data) nimmst. Das was sonst noch so drin steht findest du mit Object.keys(response) raus, welche du dann alle mit JSON.stringify() untersuchen kannst

                              Wow, so einfach. Danke! Ich geh jetzt in die Ecke schämen.

                              N Offline
                              N Offline
                              noox
                              schrieb am zuletzt editiert von noox
                              #25

                              Ich hatte zuletzt wiederholt Restarts vom Javascript-Adapter.
                              Es dürfte auftreten, wenn ich setStateAsync oder getStateAsync verwende, aber zuvor vergessen habe, den State überhaupt anzulegen.

                              Hier in dem Fall hatte ich den Prefix bei meinem State vergessen. Es kamen dann folgende Log-Einträge:

                              host.smarthome	2020-12-19 00:28:58.620	info	Restart adapter system.adapter.javascript.0 because enabled
                              host.smarthome	2020-12-19 00:28:58.619	error	instance system.adapter.javascript.0 terminated with code 6 (UNCAUGHT_EXCEPTION)
                              host.smarthome	2020-12-19 00:28:58.619	error	Caught by controller[0]: State "FullyKioskErreichbar" not found
                              host.smarthome	2020-12-19 00:28:58.613	error	Caught by controller[0]: 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(). The promise rejected
                              javascript.0	2020-12-19 00:28:58.187	info	(9941) terminating
                              javascript.0	2020-12-19 00:28:58.186	info	(9941) terminating
                              javascript.0	2020-12-19 00:28:57.981	warn	(9941) Terminated (UNCAUGHT_EXCEPTION): Without reason
                              

                              Ein try { ... } catch(error) { } hilft, aber wenn man das nicht hat ist ein Restart ja doch eher problematisch, oder?

                              PS: Hab extra noch upgedatet:
                              Node: 12.20.0
                              JS-Adapter: 4.10.8 (also latest)
                              JS-Controller: 3.1.6

                              Nachtrag: Auf Github habe ich dazu noch nix gefunden.

                              N 1 Antwort Letzte Antwort
                              0
                              • N noox

                                Ich hatte zuletzt wiederholt Restarts vom Javascript-Adapter.
                                Es dürfte auftreten, wenn ich setStateAsync oder getStateAsync verwende, aber zuvor vergessen habe, den State überhaupt anzulegen.

                                Hier in dem Fall hatte ich den Prefix bei meinem State vergessen. Es kamen dann folgende Log-Einträge:

                                host.smarthome	2020-12-19 00:28:58.620	info	Restart adapter system.adapter.javascript.0 because enabled
                                host.smarthome	2020-12-19 00:28:58.619	error	instance system.adapter.javascript.0 terminated with code 6 (UNCAUGHT_EXCEPTION)
                                host.smarthome	2020-12-19 00:28:58.619	error	Caught by controller[0]: State "FullyKioskErreichbar" not found
                                host.smarthome	2020-12-19 00:28:58.613	error	Caught by controller[0]: 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(). The promise rejected
                                javascript.0	2020-12-19 00:28:58.187	info	(9941) terminating
                                javascript.0	2020-12-19 00:28:58.186	info	(9941) terminating
                                javascript.0	2020-12-19 00:28:57.981	warn	(9941) Terminated (UNCAUGHT_EXCEPTION): Without reason
                                

                                Ein try { ... } catch(error) { } hilft, aber wenn man das nicht hat ist ein Restart ja doch eher problematisch, oder?

                                PS: Hab extra noch upgedatet:
                                Node: 12.20.0
                                JS-Adapter: 4.10.8 (also latest)
                                JS-Controller: 3.1.6

                                Nachtrag: Auf Github habe ich dazu noch nix gefunden.

                                N Offline
                                N Offline
                                noox
                                schrieb am zuletzt editiert von noox
                                #26

                                Update: Ich dürfte einen Fehler gemacht haben. Das Beispiel von unten ist zu einfach. Da dürfte es zu keinem Problem kommen. Aber Prinzipiell gibt es das Problem.

                                Ist eigentlich jemand von euch schon auf "Concurrency"-Probleme gestoßen? JavaScript ist ja Singlethreaded, sodass man sich normalerweise nicht um Concurrency kümmern muss.

                                Aber mit async/await kann es leicht passieren, dass derselbe Code scheinbar "gleichzeitig" ausgeführt wird.

                                Aktuelles Beispiel:
                                Ich hole mir mit einem HTTP-Request einige Status-Werte eines Gerätes. Ich hab das etwas abstrahiert und gecached. D.h. ich sage sowas wie: getValue('X'). Wenn der Werte vom letzten Abruf noch nicht zu alt ist, liefert mir getValue den direkt, sonst werden die Werte zuvor per HTTP-Request neu geladen.

                                let x = await getValue(`X`);
                                let y = await getValue(`Y`);
                                

                                Schaut unscheinbar aus ;)
                                Aber wenn der Cache nicht mehr gültig ist, dann werden hier zwei HTTP-Requests gemacht. Während nämlich getValue('X') auf den HTTP-Response wartet, wird getValue('Y') ausgeführt und startet dann ebenfalls den HTTP-Request.

                                Das Ganze würde natürlich mit Callbacks genauso passieren.

                                Etwas Änliches kann auch mit set/getStateAsync passieren. Auch beim "alten" setState. Da aber das "alte" getState blockiert, stolpert man da nicht so häufig drüber.

                                Leider hat JavaScript zwar async/await aber - soweit ich weiß - keinen eingebauten Locking-Mechanismus (Locks, Semaphore oder Ähnliches.)

                                Es gibt ein paar NPM-Module. Hat da schon jemand Erfahrung, was da sinnvoll ist?

                                AlCalzoneA 1 Antwort Letzte Antwort
                                0
                                • N noox

                                  Update: Ich dürfte einen Fehler gemacht haben. Das Beispiel von unten ist zu einfach. Da dürfte es zu keinem Problem kommen. Aber Prinzipiell gibt es das Problem.

                                  Ist eigentlich jemand von euch schon auf "Concurrency"-Probleme gestoßen? JavaScript ist ja Singlethreaded, sodass man sich normalerweise nicht um Concurrency kümmern muss.

                                  Aber mit async/await kann es leicht passieren, dass derselbe Code scheinbar "gleichzeitig" ausgeführt wird.

                                  Aktuelles Beispiel:
                                  Ich hole mir mit einem HTTP-Request einige Status-Werte eines Gerätes. Ich hab das etwas abstrahiert und gecached. D.h. ich sage sowas wie: getValue('X'). Wenn der Werte vom letzten Abruf noch nicht zu alt ist, liefert mir getValue den direkt, sonst werden die Werte zuvor per HTTP-Request neu geladen.

                                  let x = await getValue(`X`);
                                  let y = await getValue(`Y`);
                                  

                                  Schaut unscheinbar aus ;)
                                  Aber wenn der Cache nicht mehr gültig ist, dann werden hier zwei HTTP-Requests gemacht. Während nämlich getValue('X') auf den HTTP-Response wartet, wird getValue('Y') ausgeführt und startet dann ebenfalls den HTTP-Request.

                                  Das Ganze würde natürlich mit Callbacks genauso passieren.

                                  Etwas Änliches kann auch mit set/getStateAsync passieren. Auch beim "alten" setState. Da aber das "alte" getState blockiert, stolpert man da nicht so häufig drüber.

                                  Leider hat JavaScript zwar async/await aber - soweit ich weiß - keinen eingebauten Locking-Mechanismus (Locks, Semaphore oder Ähnliches.)

                                  Es gibt ein paar NPM-Module. Hat da schon jemand Erfahrung, was da sinnvoll ist?

                                  AlCalzoneA Offline
                                  AlCalzoneA Offline
                                  AlCalzone
                                  Developer
                                  schrieb am zuletzt editiert von
                                  #27

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

                                  Während nämlich getValue('X') auf den HTTP-Response wartet, wird getValue('Y') ausgeführt und startet dann ebenfalls den HTTP-Request.

                                  Genau das verhindert await eigentlich (wenn die Funktion entweder async ist oder einen Promise zurück gibt). Ich gehe schwer davon aus, dass deine getValue-Funktion nicht richtig implementiert ist.

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

                                  Etwas Änliches kann auch mit set/getStateAsync passieren.

                                  Eigentlich nicht. Zeig doch bitte mal ein Beispiel, wo das nachvollziehbar ist.

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

                                  N 1 Antwort Letzte Antwort
                                  0
                                  • AlCalzoneA AlCalzone

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

                                    Während nämlich getValue('X') auf den HTTP-Response wartet, wird getValue('Y') ausgeführt und startet dann ebenfalls den HTTP-Request.

                                    Genau das verhindert await eigentlich (wenn die Funktion entweder async ist oder einen Promise zurück gibt). Ich gehe schwer davon aus, dass deine getValue-Funktion nicht richtig implementiert ist.

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

                                    Etwas Änliches kann auch mit set/getStateAsync passieren.

                                    Eigentlich nicht. Zeig doch bitte mal ein Beispiel, wo das nachvollziehbar ist.

                                    N Offline
                                    N Offline
                                    noox
                                    schrieb am zuletzt editiert von
                                    #28

                                    @AlCalzone
                                    Ja, ich hab mich verwirren lassen. Sorry. Das Beispiel ist zu einfach.

                                    Passieren würde es aber meiner Meinung nach, wenn die Zugriffe unabhängig voneinander wären. Also z.B. einer von einer Subscription oder einem Timer (setTimeout) aus. Und in meinem Fall war es ein setTimeout.

                                    Aber selbst da befürchte ich, dass ich mich verschaut habe, da ich zwei Geräte parallel abfrage.

                                    Aber ich hatte früher schon mal das Problem, wo ein Script einen State schreibt, und ein anderes diesen abonniert hat. Und wo dann kurzzeitig der State öfter geändert wurde, als ihn die Subscription abarbeiten konnte. Damals habe ich es ohne Lock gelöst, aber sowas könnte ein Fall für Locks sein.
                                    Aber auch deswegen war ich diesmal etwas zu vorschnell. Sorry!

                                    N AlCalzoneA 2 Antworten Letzte Antwort
                                    0
                                    • N noox

                                      @AlCalzone
                                      Ja, ich hab mich verwirren lassen. Sorry. Das Beispiel ist zu einfach.

                                      Passieren würde es aber meiner Meinung nach, wenn die Zugriffe unabhängig voneinander wären. Also z.B. einer von einer Subscription oder einem Timer (setTimeout) aus. Und in meinem Fall war es ein setTimeout.

                                      Aber selbst da befürchte ich, dass ich mich verschaut habe, da ich zwei Geräte parallel abfrage.

                                      Aber ich hatte früher schon mal das Problem, wo ein Script einen State schreibt, und ein anderes diesen abonniert hat. Und wo dann kurzzeitig der State öfter geändert wurde, als ihn die Subscription abarbeiten konnte. Damals habe ich es ohne Lock gelöst, aber sowas könnte ein Fall für Locks sein.
                                      Aber auch deswegen war ich diesmal etwas zu vorschnell. Sorry!

                                      N Offline
                                      N Offline
                                      noox
                                      schrieb am zuletzt editiert von
                                      #29

                                      Ui ... und ich hab mehrmals das await vergessen. Ich programmiere in Visual Studio Code.

                                      Bin's aber von C# und Visual Studio so gewohnt, dass man auf ein vergessenes await aufmerksam gemacht wird.

                                      AlCalzoneA 1 Antwort Letzte Antwort
                                      0
                                      • N noox

                                        Ui ... und ich hab mehrmals das await vergessen. Ich programmiere in Visual Studio Code.

                                        Bin's aber von C# und Visual Studio so gewohnt, dass man auf ein vergessenes await aufmerksam gemacht wird.

                                        AlCalzoneA Offline
                                        AlCalzoneA Offline
                                        AlCalzone
                                        Developer
                                        schrieb am zuletzt editiert von
                                        #30

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

                                        Bin's aber von C# und Visual Studio so gewohnt, dass man auf ein vergessenes await aufmerksam gemacht wird.

                                        Das macht VSCode auch, wenn die Einstellungen entsprechend gesetzt sind (Typechecking aktiv)

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

                                        1 Antwort Letzte Antwort
                                        0
                                        • N noox

                                          @AlCalzone
                                          Ja, ich hab mich verwirren lassen. Sorry. Das Beispiel ist zu einfach.

                                          Passieren würde es aber meiner Meinung nach, wenn die Zugriffe unabhängig voneinander wären. Also z.B. einer von einer Subscription oder einem Timer (setTimeout) aus. Und in meinem Fall war es ein setTimeout.

                                          Aber selbst da befürchte ich, dass ich mich verschaut habe, da ich zwei Geräte parallel abfrage.

                                          Aber ich hatte früher schon mal das Problem, wo ein Script einen State schreibt, und ein anderes diesen abonniert hat. Und wo dann kurzzeitig der State öfter geändert wurde, als ihn die Subscription abarbeiten konnte. Damals habe ich es ohne Lock gelöst, aber sowas könnte ein Fall für Locks sein.
                                          Aber auch deswegen war ich diesmal etwas zu vorschnell. Sorry!

                                          AlCalzoneA Offline
                                          AlCalzoneA Offline
                                          AlCalzone
                                          Developer
                                          schrieb am zuletzt editiert von
                                          #31

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

                                          Passieren würde es aber meiner Meinung nach, wenn die Zugriffe unabhängig voneinander wären. Also z.B. einer von einer Subscription oder einem Timer (setTimeout) aus. Und in meinem Fall war es ein setTimeout.

                                          Korrekt. Da kann dir aber kein so grundlegendes Sprachfeature helfen, das musst du selbst steuern.

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

                                          1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          717

                                          Online

                                          32.5k

                                          Benutzer

                                          81.8k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe