Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Verhalten im Loop
#1
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.
Zitieren
#2
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?
Hier sind alle meine Lösungen aus allen Foren. Ich helfe auch in Facebook-chat
Zitieren
#3
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
"Gerne dürft ihr mir eine gute Bewertung da lassen aber auch gegenüber Kritik bin ich offen" Angel
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen:
1 Gast/Gäste