Javascript-forum
Verhalten im Loop - Druckversion

+- Javascript-forum (https://javascript-forum.de)
+-- Forum: Entwicklung (https://javascript-forum.de/forumdisplay.php?fid=4)
+--- Forum: Javascript (https://javascript-forum.de/forumdisplay.php?fid=6)
+--- Thema: Verhalten im Loop (/showthread.php?tid=1572)



Verhalten im Loop - GombersJS - 05.10.2022

Ich habe bei ioBroker ein Problem eröffnet. Das ist ziemlich länglich geworden - es geht mir im Wesentlichen jetzt um diesen Post.



Code:
var switchStatus, Intervall;
on({id: "shelly.0.SHSW-1#E8DB84D401CC#1.ext.switch1"/*Switch*/, change: "ne"}, async function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  switchStatus = (obj.state ? obj.state.val : "");
  console.log(('Scriptanfang Status: ' + String(switchStatus)));
  if (switchStatus == true) {
    Intervall = setInterval(async function () {
      console.log(('Loopanfang Status: ' + String(switchStatus)));
      switchStatus = (obj.state ? obj.state.val : "");
    }, 20000);
  } else {
    console.log(('Else Status: ' + String(switchStatus)));
    (function () {if (Intervall) {clearInterval(Intervall); Intervall = null;}})();
  }
});


Die Variable "switchStatus" wird aus einem Objekt ausgelesen und in der gezeigten "if/then/else" Abfrage ausgewertet.

Im "then"-Zweig wird, wie man sieht, im Loop eine Meldung ausgegeben udn der Wert der Variablen "switchStatus" neu ermittelt. Aber es gibt keine Ende-Bedingung. Meines Erachtens müsste der Loop damit eben endlos laufen. Tatsächlich wird, wenn der "switchStatus" auf false geht, der "else"-Zweig angestoßen. Die Logik verstehe ich nicht, die "if"-Abfrage ist Vergangenheit, wieso weiß "setInterval()" was von dem else-Zweig?


Irgendeine logische Erklärung wäre mir lieb.


RE: Verhalten im Loop - admin - 06.10.2022

Gute frage.
Wäre gut, wenn man sich den Code mal live in Action ansehen könnte, weil man dann auch anderen Code sehen kann der auf der Seite noch so ist.

Wenn der Code so wäre PSYDOCODE
Code:
function neu(obj){

switchStatus = (obj.state ? obj.state.val : "");
  console.log(('Scriptanfang Status: ' + String(switchStatus)));
  if (switchStatus == true) {
    Intervall = setTimeoutl(async function () {
      console.log(('Loopanfang Status: ' + String(switchStatus)));
      switchStatus = (obj.state ? obj.state.val : "");
      neu(obj);
    }, 20000);
  } else {
    console.log(('Else Status: ' + String(switchStatus)));
    (function () {if (Intervall) {clearTimeout(Intervall); Intervall = null;}})();
  }
  
}
neu(obj)

Würde sich der Code alle 2 Sekunden selber aufrufen und dann bei false natürlich in den else Zweig gehen.

Ich könnte mir vorstellen, dass es an async liegt, aber kann nur raten.
Hast du das irgendwo online, wo man das testen kann?


RE: Verhalten im Loop - rzscout - 06.10.2022

Schreibe Bitte immer dazu wenn es sich um ein node.js-Projekt handelt. Es ist immer im Vorteil vorher zu wissen worum es geht.

Es macht einen großen Unterschied ob der JavaScript-Code für eine Webseite steht oder in node.js. Da nicht jeder ioBroker kennt, ist das immer sehr praktisch zu wissen um was es geht.

PS: Ich finde es cool wenn man Projekte mit Node.js realisiert.

Viele Grüße
rzscout