Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Entwicklung
    4. Wiedermal das leidige Thema mit Async

    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

    Wiedermal das leidige Thema mit Async

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

      Hallo miteinander,

      ich bräuchte Unterstützung bei dem "Umschreiben" einer Funktion in eine Async Funktion.

      Ich verwende in meiner AdminOberfläche die sendTo-Funktion um Daten aus meiner main.js bei Adapterstart abzufragen, doch leider wird beim erstmaligen Adapterstart nach der Installation das Ergebnis zu spät zurückgemeldet und das Dropdown-Feld im Admin ist schon erstellt (ohne Inhalt).

      Da ich nun wie schon öfter beschrieben leider nicht der Javascript - Profi bin bräuchte ich Hilfe beim Umschreiben folgender schon in der main.js vorhandenen Funktion:

      message: (obj) => {
                   if (typeof obj === 'object' && obj.message) {
                       if (obj.command === 'send') {
                           // e.g. send email or pushover or whatever
                           adapter.log.info('send command');
                           
                           const visData = new Object();
                           visData.projectList = readProjects();
                           visData.viewList = readViews(adapter.config.visProject);
                           
                           // Send response in callback if required
                           if (obj.callback) adapter.sendTo(obj.from, obj.command, visData, obj.callback);
                       }
                   }
               }
      

      Ich habe das Ganze auch schon einige Male versucht, habe aber jedesmal irgendwo im Syntax einen Fehler. Es wäre toll wenn sich einer der Profis hier mal 10 Sekunden 😉 Zeit nehmen könnte um mir hier zu Helfen.

      UncleSam OliverIO AlCalzone 3 Replies Last reply Reply Quote 0
      • UncleSam
        UncleSam Developer @Peoples last edited by UncleSam

        @Peoples sagte in Wiedermal das leidige Thema mit Async:

        doch leider wird beim erstmaligen Adapterstart nach der Installation das Ergebnis zu spät zurückgemeldet und das Dropdown-Feld im Admin ist schon erstellt (ohne Inhalt).

        Das Problem wird dir async/await auch nicht lösen. Es ist nur eine schönere Darstellung des (beinahe) gleichen Codes. Du musst also im index_m.html damit umgehen können, dass die Antwort auf dein sendTo() verzögert kommt.

        Wenn du das Problem lösen willst, bleibt dir nur, im index_m.html dein GUI erst zu erstellen, wenn dein sendTo-Callback aufgerufen wird.

        P.S.: ich wüsste nicht, wie man deine Funktion async machen könnte, da sie gar keine Callbacks hat.

        Peoples 1 Reply Last reply Reply Quote 0
        • Peoples
          Peoples @UncleSam last edited by Peoples

          @UncleSam

          Aktuel mache ich das so:

          async function getVisContent() {
                          return new Promise(function (resolve, reject) {
                              const mObj = new Object();
                                    mObj.command = 'send';
                                    mObj.message = 'getVisData';
          
                             sendTo('viewswitch.0', 'send', mObj, (visData) => {
                                  if(visData.error) {
                                      reject('Error: ' + visData.error);
                                  } else {
                                      resolve(visData);
                                  }
                              });
                          });
                      }
          
          
          async function genProjectSelect() {
                          try{
                              let id;
                              let $sel = $('#visProject');
                              let result = '';
                              const visData = await getVisContent();
                              const visDataProjects = visData.projectList;
                              let arr = [];
                              if(visData.projectList ==''){
                                  arr.push['main'];
                              } else {
                                 arr = visData.projectList;
                              }
                              if(!settings['visProject'] || settings['visProject'] == ''){
                                  $sel.html('<option value="allProjects">' + _('Select first') + '</option>');
                              } else {
                                  $sel.html();
                                  id = settings['visProject'];
                              }
                              arr.sort();
                              arr.forEach(function(val) {
                                       //$('#counties').append('<option value="' + val[0] + '"' + (id === val[0] ? ' selected' : '') + '>' + val[1] + '</option>');
                                  $('#visProject').append('<option value="' + val + '"' + (id === val ? ' selected' : '') + '>'+val+' </option>');
                              });
                              $sel.select();
                              
                          }catch(e) {
                              console.log(e); // 30
                          }
                          
                      } 
          
                      genProjectSelect();
          
          
          
          

          aber das bringt eben leider nicht immer den gewünschten Effekt

          UncleSam 1 Reply Last reply Reply Quote 0
          • UncleSam
            UncleSam Developer @Peoples last edited by

            @Peoples Ich sehe gerade auch nicht, was hier schief gehen könnte. Wie verhält es sich denn, wenn's nicht geht?

            Peoples 1 Reply Last reply Reply Quote 0
            • Peoples
              Peoples @UncleSam last edited by

              @UncleSam
              Das erstellte Dropdown ist ohne Inhalt. Verlasse ich die Admin Oberfläche und öffne Sie wieder ist der Inhalt da.

              Ich habe auch schon mal ein "PopUp" das bestätigt werden muss eingebaut dann geht es auch.

              simatec 1 Reply Last reply Reply Quote 0
              • simatec
                simatec Developer Most Active @Peoples last edited by

                @Peoples
                Ich hatte in dem Adapter schoolfree das gleich Problem und habe es aus diesem Grund mit fetch in der index gelöst.

                sendTo ist beim ersten Adapterstart halt nicht so gut. Oder du baust in der index ein timeout ein, falls die Daten noch nicht vorhanden sind.

                Falls die Daten bereits vorhanden sind, kannst du ja den timeout umgehen.

                Als Wartezeit bei dem Timeout kannst du ja ein Info Popup einblenden

                Peoples 1 Reply Last reply Reply Quote 0
                • Peoples
                  Peoples @simatec last edited by

                  @simatec
                  Aber wie mache ich das mit dem fetch wenn ich eigentlich keine URL habe da ich ja die Daten aus der main.js - Funktion abgreifen will

                  simatec 1 Reply Last reply Reply Quote 0
                  • simatec
                    simatec Developer Most Active @Peoples last edited by

                    @Peoples
                    Ich löse das alles in der index.
                    Aus der main hole ich nix ab.

                    Meine Daten stehen alle in einer json, die ich mir mit fetch auslese.

                    Ich konnte leider auch keine bessere Lösung finden, aber so funktioniert das einlesen beim schoolfree Adapter recht ordentlich

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

                      @Peoples
                      https://github.com/oweitman/ioBroker.mytime/blob/080b20cc33e1a21eb726b199cf3f07feff75590a/admin/index_m.html#L206

                      Hier kannst du schauen wie das Zusammenspiel zwischen Admin Oberfläche und Adapter mittels sendto funktioniert.
                      Allerdings verwende ich kein promise sondern einen stinknormalen callback.

                      Beim link musst du ein wenig aufpassen, da dieser auf eine ältere Version des repos verweist. Mittlerweile habe ich den Adapter auf react überarbeitet und es etwas anders gelöst.

                      Da du keinen Einfluss auf die Zeit zur Rückmeldung der Daten hast, wirst du im html dein Dropdown erst einmal leer definieren und dann wenn die Daten ankommen dieses html Element dynamisch befüllen. Dabei hilft die jquery, welches von Iobroker automatisch schon geladen wird.
                      https://stackoverflow.com/questions/815103/jquery-best-practice-to-populate-drop-down

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

                        @Peoples sagte in Wiedermal das leidige Thema mit Async:

                        erstmaligen Adapterstart nach der Installation das Ergebnis zu spät zurückgemeldet und das Dropdown-Feld im Admin ist schon erstellt

                        In Zwave2 mache ich das so, dass ich den State system.adapter.zwave2.0.alive abfrage und subscribe und erst wenn dieser true ist, die Abfragen mache, die von der Instanz beantwortet werden müssen.

                        1 Reply Last reply Reply Quote 1
                        • Peoples
                          Peoples @OliverIO last edited by

                          @OliverIO
                          Bei dir klingt das immer so einfach aber aus meiner Sicht ist es, als würde ein Professor mit einem Grundschüler reden 🙂

                          OliverIO 2 Replies Last reply Reply Quote 0
                          • OliverIO
                            OliverIO @Peoples last edited by OliverIO

                            @Peoples

                            Oh, ich hab auch viel rumprobiert
                            Schau dir die codestellen an und wenn du fragen hast frag.
                            Manchmal muss man sich durch beißen.
                            Auch hilft es, in anderen Adaptern mal zu schauen wie da bereits etwas gelöst wurde

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

                              @Peoples

                              so ich hab mir deinen code nochmal angeschaut und folgendes gefunden:

                              admin/client:
                              1)

                              async function getVisContent() {
                              

                              das async kann da weg, gemäß mdn dokumentation ist async nur in einer funktion notwendig, in der mit await aufgerufen wird.
                              2)

                              sendTo('viewswitch.0', 'send', mObj, (visData) => {
                              

                              scheint korrekt zu sein.
                              wenn du hier im Forum fragen stellst, sind diese Fehlermeldungen wichtig. bitte nicht einfach schreiben "irgendwo im Syntax einen Fehler".
                              Bitte konkret benennen mit Zeile und exakte Fehlermeldung, wie sie in der debugger console ausgegeben wird.
                              Der sendTo-Aufruf im client sieht bei mir wie folgt aus. Ich verwende hierden socketefehldirekt.:

                              function getCountdownInfo(callback) {
                                                      this.socket.emit('sendTo', [adapter,instance].join('.'), 'getCountdownInfo', {},function (data) {
                                                          callback(data);
                                                      });        
                                                  }
                              

                              Server

                              hier sieht es für mich erst einmal ok aus.

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

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              810
                              Online

                              31.9k
                              Users

                              80.2k
                              Topics

                              1.3m
                              Posts

                              adapter async sentto
                              5
                              13
                              535
                              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