NEWS

hilfe - javascript- axios, await - pause bei abruf von daten


  • ich habe eine schleife mit einem selektor:

    $('sonoff.0.*.INFO.IPAddress').each(function(id, i) {          
             var ida = id.split('.');
             myPower="na";
             myPower1="na";
             myPower2="na";
    
      if(getState("sonoff.0."+ida[2]+".alive").val && parseInt(getState("sonoff.0."+ida[2]+".INFO.Version").val.replace(/^(.).+/,"$1")) >=5) {
             if (existsState("sonoff.0."+ida[2]+".POWER")) myPower=getState("sonoff.0."+ida[2]+".POWER").val.toString()
             if (existsState("sonoff.0."+ida[2]+".POWER1")) myPower1=getState("sonoff.0."+ida[2]+".POWER1").val.toString()
             if (existsState("sonoff.0."+ida[2]+".POWER2")) myPower2=getState("sonoff.0."+ida[2]+".POWER2").val.toString()      
        for (let ii=1;ii<=anzahlTimer;ii++){
    
            let myhttp=`http://${getState(id).val}/cm?cmnd=timer${ii}`
    
           let helpi=getState("sonoff.0."+ida[2]+".INFO.Hostname").val;
    
           
       //  resolveAfter2Seconds();log("!!!!!!")
           for(let i=0;i<filterArray.length;i++){
                  if (filterArray[i]==helpi) { getData(myhttp,id,helpi,myPower,myPower1,myPower2);
                                               if(myPowerOld!=helpi){
                                                    if (myPower!="na")  arrTrigger.push("sonoff.0."+ida[2]+".POWER");
                                                    if (myPower1!="na") arrTrigger.push("sonoff.0."+ida[2]+".POWER1");
                                                    if (myPower2!="na") arrTrigger.push("sonoff.0."+ida[2]+".POWER2");
                                                    myPowerOld=helpi}}
           }
    
         }}
    
       }); 
    

    darin wird die funktion getData aufgerufen (über axios werden bei den sonoffs bestimmte werte abgerufen):

           async function getData(url,id,hostname,power,power1,power2) {
              
      try {
        const response = await axios.get(url)
         if(JSON.stringify(response.data).includes("Timer")) { if(JSON.stringify(response.data).includes(`Arm":1,`) ) myArr.push([JSON.stringify(response.data),id,hostname,power,power1,power2]) }
      
      } catch (error) {
         let myError="Verbindungsproblem - Sonoff Timer script - Script neustarten evtl. Sonoff vom Strom nehmen" //'{"Timerx":{"Arm":1,"Mode":0,"Time":"error","Window":0,"Days":"0000000","Repeat":1,"Output":1,"Action":2}}'
         // myArr.push([myError,dpRefresh,"error"]);log(myArr.toString())
           console.log(myError + " - " + hostname);
      }
    }
    

    meine frage dazu - wie schaffe ich es , da bei dem abruf über axios immer eine kleine zeitliche pause ist - die sonoffs brauchen wohl eine kleine "verschnaufpause" - das script funktioniert eigentlich, aber manchmal steigen sonoffs aus und kommen nicht mehr mit

  • Developer

    @liv-in-sky In Zeile 20 rufst du getData (eine async-Funktion) ohne await davor auf. Das bewirkt, dass du einen Haufen Requests nahezu parallel abfeuerst, ohne zu warten, dass diese auch fertig sind.

    Lösung:
    Zeile 1: aus function ein async function machen.
    Zeile 20: vor getData ein await packen.


    Falls es dann immer noch notwendig sein sollte zu warten, kannst du dir wie folgt behelfen:

    function wait(ms) {
        return new Promise((resolve) => {
            setTimeout(resolve, ms);
        });
    }
    

    und dann am Ende der obigen Schleife vor Zeile 28 (glaube ich, das ist furchtbar formatiert) ein await wait(10) packen. (oder eine sinnvolle Anzahl von Millisekunden).


  • @AlCalzone erstmal danke - habe diese selektor abfrage in einer function und habe die , die ganze zeit mit async definiert - im selektor bekam ich immer ein await ist nicht erlaubt - ist schon mal ein guter schritt
    habe immer async function writeHTML() .. geschrieben 😞

    aber leider bekomme ich einen kringel, wenn ich es hier machen - muss ich das anders aufrufen:

    Image 4.png

    ich weiß nicht, wie viele videos zu diesem thema ich schon angeschaut habe - aber in der praxis, bei eigenen scripts - stell ich mich immer wieder an 😞

  • Developer

    @liv-in-sky Was ist denn der Fehler, wenn du mit der Maus über den Kringel gehst?


  • @AlCalzone

    es funktioniert aber trotz des kringels - mit der await wait... function wird das gut ausgebremmst -

    Image 5.png
    Image 6.png

    vielleicht fällt dir noch was zum kringel ein - der fehler sagt

    smart79.gif

  • Developer

    @liv-in-sky Ah, ok das lässt sich ändern. Müsste aber so funktionieren.

Suggested Topics

1.7k
Online

36.9k
Users

42.6k
Topics

590.2k
Posts