Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Problem mit await setStateAsync()

    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

    Problem mit await setStateAsync()

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

      Hallo,
      jetzt dachte ich, dass ich es verstanden habe, aber es funktioniert nicht wie von mir erwartet. Wenn ich await setStateAsync() aufrufe, sollte doch ein anschliessendes getState() korrekte Werte liefern, oder liege ich da falsch?
      Ohne zusätzliches wait() in Zeile 12 wirft JSON.parse() in Zeile 13 einen Fehler, weil die Werte wohl noch nicht fertig geschrieben sind. Mit funktioniert alles

      Edit: Nach einem Neustart des Systems war es wesentlich schneller, so dass ich das gezeigte mit den wenigen zu schreibenden Daten im Beispiel nicht mehr nachvollziehen kann. Mit den Originaldaten(>1000 Datensätze) bleibt das Beschriebene aber

      (JS-Adapter: 4.9.7, Node: 14.15.0, NPM: 6.14.8)

      async function getData() {
          await setStateAsync('0_userdata.0.example_state', '');
          await setStateAsync('0_userdata.0.example_state', '{"A":1,"B":2}');
          return true;
      }
      
      async function main(refresh = false) {
          if(refresh){
              if(!await getData()) return log('No data');
          }
          //ohne wait() Fehler bei JSON.parse(getState())
          //await wait(100);
          let x = JSON.parse(getState('0_userdata.0.example_state').val);
          log(x)
      }
      
      main(true);
      
      14:08:42.588	info	javascript.0 (12740) Start javascript script.js.Aktiv.tst
      14:08:42.593	info	javascript.0 (12740) script.js.Aktiv.tst: registered 0 subscriptions and 0 schedules
      14:08:42.643	error	javascript.0 (12740) script.js.Aktiv.tst: SyntaxError: Unexpected end of JSON input
      14:08:42.644	error	javascript.0 (12740) at b (script.js.Aktiv.tst:13:18)
      
      liv-in-sky AlCalzone 2 Replies Last reply Reply Quote 0
      • liv-in-sky
        liv-in-sky @fastfoot last edited by

        @fastfoot

        wie sieht es damit aus

           if(!(await getData())) return log('No data');
        
        F 1 Reply Last reply Reply Quote 0
        • AlCalzone
          AlCalzone Developer @fastfoot last edited by

          @fastfoot sagte in Problem mit await setStateAsync():

          sollte doch ein anschliessendes getState() korrekte Werte liefern, oder liege ich da falsch?

          Probier es bitte mal mit await getStateAsync statt getState. Nicht auszuschließen, dass der Cache im Skript-Adapter hier auf die Parade regnet.

          F 1 Reply Last reply Reply Quote 0
          • F
            fastfoot @liv-in-sky last edited by

            @liv-in-sky sagte in Problem mit await setStateAsync():

            @fastfoot

            wie sieht es damit aus

               if(!(await getData())) return log('No data');
            

            Im Original habe ich es tatsächlich so wie von dir gezeigt, und denke mittlerweile auch dass das so richtig ist.

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

              @AlCalzone sagte in Problem mit await setStateAsync():

              @fastfoot sagte in Problem mit await setStateAsync():

              sollte doch ein anschliessendes getState() korrekte Werte liefern, oder liege ich da falsch?

              Probier es bitte mal mit await getStateAsync statt getState. Nicht auszuschließen, dass der Cache im Skript-Adapter hier auf die Parade regnet.

              Danke, das funktioniert zuverlässig! Es verwirrt mich allerdings ziemlich 😞

              Was mich etwas 'stört' an dieser ganzen async/await Sache, gefühlt steht jetzt überall await vor den Funktionen. Ist das meinem Programmierverhalten in herkömmlichen Sprachen geschuldet und sollte ich das ändern, damit es besser zu der Asynchronizität von JS passt? Zur Zeit habe ich etwas das Gefühl dass ich JS dadurch nicht voll in seinen Möglichkeiten ausschöpfe?

              Noch etwas ist mir aufgefallen und hat mich viel Zeit gekostet: Mit getState() kann ich id-Akürzungen für States in z.B. javascript.0 benutzen, also getState('test'), mit getStateAsync() muss ich zwingend getStateAsync('javascript.0.test') benutzen. Scheint dass das jetzt zukünftig meine BestPractice wird 🙂

              Ausserdem muss man scheinbar Klammern nutzen, um einen Wert bei getStateAsync() zu erhalten also let x = (await getStateAsync(id)).val. Ist das korrekt?

              AlCalzone 1 Reply Last reply Reply Quote 0
              • AlCalzone
                AlCalzone Developer @fastfoot last edited by

                @fastfoot sagte in Problem mit await setStateAsync():

                Was mich etwas 'stört' an dieser ganzen async/await Sache, gefühlt steht jetzt überall await vor den Funktionen.

                Das ist völlig normal - du solltest mal sehen, wie viel ich das in meinem Code nutze.

                Das eigentliche Problem mit dem getState liegt daran, dass der Adapter eigentlich alle States zwischenspeichert und synchronisiert, sodass du in Skripten synchron und ohne Callback darauf zugreifen kannst. Das scheint allerdings nicht immer zuverlässig zu gehen. Müsste sich mal jemand ansehen.

                @fastfoot sagte in Problem mit await setStateAsync():

                Ausserdem muss man scheinbar Klammern nutzen, um einen Wert bei getStateAsync() zu erhalten

                Das leider korrekt.

                @fastfoot sagte in Problem mit await setStateAsync():

                mit getStateAsync() muss ich zwingend getStateAsync('javascript.0.test') benutzen

                Das sollte eigentlich nicht sein. Ist test nur ein Beispiel oder ein State, bei dem es nicht geht? Sind in den betroffenen IDs Punkte enthalten?

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

                  @AlCalzone sagte in Problem mit await setStateAsync():

                  Das ist völlig normal - du solltest mal sehen, wie viel ich das in meinem Code nutze.

                  na das beruhigt mich, als Anfänger in JS habe ich immer Zweifel

                  Müsste sich mal jemand ansehen.

                  soll ich ein issue aufmachen?

                  @fastfoot sagte in Problem mit await setStateAsync():

                  mit getStateAsync() muss ich zwingend getStateAsync('javascript.0.test') benutzen

                  Das sollte eigentlich nicht sein. Ist test nur ein Beispiel oder ein State, bei dem es nicht geht? Sind in den betroffenen IDs Punkte enthalten?

                  nee, habe es mit genau der ID probiert. was mich soviel Zeit gekostet hat war dass ich in obigem Beispiel 0_userdata.... benutzt hatte, in meinem Originalcode jedoch nach javascript.0.xxxx schreibe. Nach der Änderung zu getStateAsync() hatte ich aber immer noch die verkürzte ID benutzt und nur Fehler bekommen, die gleich/ähnlich dem Timingfehler waren 😞 ==> Jetzt kann ich diesen Fehler nicht mehr reproduzieren wenn tst im root von javascript.0 liegt. Aber wenn ich von Tests.tst lese schon, dann muss ich javascript.0.Tests.tst nehmen mit getStateAsync()
                  Hier nochmal das umgebaute Skript mit Kommentaren und Datengenerator für den Timing Fehler nach await setState()

                  async function getData(){
                      let x = [];
                      for(let i = 0; i < 5e0; i++){
                          x.push({"A":i,"B":i+1})
                      }
                      await setStateAsync('javascript.0.Tests.tst', '');
                      await setStateAsync('javascript.0.Tests.tst', JSON.stringify(x));
                      return true;
                  }
                  
                  async function main(refresh = false){
                      if(refresh){
                          if(!(await getData())) return log('No data');
                      }
                      //ohne wait() Timing Fehler 
                      //await wait(500);
                      //let x = JSON.parse(getState('Tests.tst').val);
                  
                      //funktioniert ohne wait(), benötigt vollen Pfad
                      let x = JSON.parse((await getStateAsync('javascript.0.Tests.tst')).val);
                      
                      //verkürzte ID wirft Fehler
                      //let x = JSON.parse((await getStateAsync('Tests.tst')).val);
                      log(x)
                  }
                  
                  main(true);
                  
                  AlCalzone 1 Reply Last reply Reply Quote 0
                  • AlCalzone
                    AlCalzone Developer @fastfoot last edited by

                    @fastfoot sagte in Problem mit await setStateAsync():

                    Jetzt kann ich diesen Fehler nicht mehr reproduzieren wenn tst im root von javascript.0 liegt.

                    Das deckt sich mit dem was ich im Code gesehen habe. Ist etwas ungeschickt, das könnte man bestimmt abhängig vom Adapterpräfix machen

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

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    1.0k
                    Online

                    31.8k
                    Users

                    80.0k
                    Topics

                    1.3m
                    Posts

                    3
                    8
                    1396
                    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