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
-
@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: ausfunction
einasync function
machen.
Zeile 20: vorgetData
einawait
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() .. geschriebenaber leider bekomme ich einen kringel, wenn ich es hier machen - muss ich das anders aufrufen:
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
-
@liv-in-sky Was ist denn der Fehler, wenn du mit der Maus über den Kringel gehst?
-
es funktioniert aber trotz des kringels - mit der await wait... function wird das gut ausgebremmst -
vielleicht fällt dir noch was zum kringel ein - der fehler sagt
-
@liv-in-sky Ah, ok das lässt sich ändern. Müsste aber so funktionieren.