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
-
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: ausfunctioneinasync functionmachen.
Zeile 20: vorgetDataeinawaitpacken.
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). -
@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: ausfunctioneinasync functionmachen.
Zeile 20: vorgetDataeinawaitpacken.
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:

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 :-(
-
@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:

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 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: ausfunctioneinasync functionmachen.
Zeile 20: vorgetDataeinawaitpacken.
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).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

-
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

Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden