NEWS
Script funktioniert nur bedingt
-
Hallo Community,
habe mir aus diesem Forum aus Script Schnipseln ein eigenes Script gebastelt.
Hier mal ein Auszug aus dem Script.// Eigene Datenpunkte function pruefeEigeneDatenpunkte() { if (arrDatenpunkt.length > 0) { for(var i = 0; i < arrDatenpunkt.length; i++) { var present1 = (pathRadar + '0.' + arrDatenpunkt[i]); var present2 = (pathRadar + '1.' + arrDatenpunkt[i]); on([present1, present2], function(obj) { if((present1 === obj.id) || (present2 === obj.id)) log('Sprungchance'); run(obj, obj.name); }); } } } pruefeEigeneDatenpunkte();
Das seltsame daran ist, es funktioniert nur mit dem Kommentar in Zeile 11.
Sobald ich die Zeile entferne oder ausklammere, funktioniert der Sprung zum eigentlichen Programm nicht mehr.
Kann mir da bitte jemand helfen? -
@manolo
Eine Schleifenvaraiable (i
) darfst Du nicht innerhalb wiederverwenden.
Nenne die in der inneren Schleife z.B.j
. -
@codierknecht
Die innere Schleife war ausgeklammert, brauche ich für die Funktion auch eigentlich nicht.
Sorry, dass ich das Script nicht aufgeräumt habe.
Habe es nun aber korrigiert, Ergebnis bleibt das Selbe.Es geht um die zweite If-Bedingung in Zeile 9.
das Programm "run" wird nur ausgeführt, wenn in der Zeile vorher etwas drin steht. -
@manolo sagte in Script funktioniert nur bedingt:
Ergebnis bleibt das Selbe.
welches?
was steht im log? -
@homoran
Mit Ergebnis meinte ich, dass das Programm nur ausgeführt wird, wenn die zusätzliche Zeile aktiv ist.
Ohne die Zeile wird das nachfolgende Programm nicht ausgeführt.
Im Log steht leider nichts, also kein Fehler.Was ich auch seltsam finde, ist, dass der Kommentar der hinter dem log steht ('Sprungchance') nicht als Info im Log auftaucht.
-
@manolo Bitte alles zeigen
EDIT: Keine nachträglichen Änderungen ohne Kennzeichnung!!!
-
Hier nun das ganze Script:
// +++++++++++++++++++++++++++++++++ USER ANGABEN ++++++++++++++++++++++++++++++++ var pathUser = "0_userdata.0.Anwesenheit."; var pathRadar = "radar2." var arrDatenpunkt = [ // Beispiel: 'Name' 'Peter', 'Manuel', 'Annett', 'Test' ]; // +++++++++++++++++++++++++++++ ENDE USER ANGABEN +++++++++++++++++++++++++++++++ // ######## FUNKTIONEN ######## // Eigene Datenpunkte function pruefeEigeneDatenpunkte() { if (arrDatenpunkt.length > 0) { for(var i = 0; i < arrDatenpunkt.length; i++) { var present1 = (pathRadar + '0.' + arrDatenpunkt[i]); var present2 = (pathRadar + '1.' + arrDatenpunkt[i]); on([present1, present2], function(obj) { // for(var j = 0; i < arrDatenpunkt.length; j++) { if((present1 === obj.id) || (present2 === obj.id)) log('Sprungchance'); run(obj, obj.name); // } }); } } } pruefeEigeneDatenpunkte(); //----------------------------------------------------------------------------// // Programm starten function run(obj, name) { // if ( !existsState(pathUser + name)) { erstelleStates(name);} log('Im Programm kommen wir an'); log(name); if (getState(pathRadar + '0.' + name).val == true || getState(pathRadar + '1.' + name).val == true) { log('User ' + name + ' wurde aktiviert'); setState(pathUser + name, true, true); } else { log('User ' + name + ' wurde deaktiviert') setState(pathUser + name, false, true); } } //----------------------------------------------------------------------------// // Datenpunkte erstellen function erstelleStates (namen) { createState(pathUser + namen, false, {name: namen + 'Anwesend', type: 'boolean' }); } //----------------------------------------------------------------------------//
-
@manolo
Dass Du da in einer Schleife Trigger erzeugst ist Dir klar?
Das "run()" wird nur ausgeführt, wenn der Trigger feuert.Ich würde den ganzen Kram mal vernünftig einrücken, damit man auch sieht was da wie zusammengehört.
Ohne jegliche Berücksichtigung der Funktionalität - die erschließt sich mir nicht.// Eigene Datenpunkte function pruefeEigeneDatenpunkte() { if (arrDatenpunkt.length > 0) { for (var i = 0; i < arrDatenpunkt.length; i++) { var present1 = (pathRadar + '0.' + arrDatenpunkt[i]); var present2 = (pathRadar + '1.' + arrDatenpunkt[i]); on([present1, present2], function(obj) { if ((present1 === obj.id) || (present2 === obj.id)) { log('Sprungchance'); } run(obj, obj.name); }); } } } pruefeEigeneDatenpunkte();
-
@manolo sagte in Script funktioniert nur bedingt:
Es geht um die zweite If-Bedingung in Zeile 9.
Dank
var
stattconst
sind die Variablen praktisch global. Das funktioniert so nicht. Google:- JavaScript Scope: https://www.w3schools.com/js/js_scope.asp
- Block Scope
-
@manolo und das log?
... auf der Seite Protokolle und unter dem Editorfenster -
Einfach nie
var
verwenden. Dann hat man auch keine Probleme// Eigene Datenpunkte function pruefeEigeneDatenpunkte() { if (arrDatenpunkt.length > 0) { for(let i = 0; i < arrDatenpunkt.length; i++) { const present1 = `${pathRadar}0.${arrDatenpunkt[i]}`; const present2 = `${pathRadar}1.${arrDatenpunkt[i]}`; on([present1, present2], (obj) => { if (present1 === obj.id || present2 === obj.id) { log('Sprungchance'); run(obj, obj.name); } }); } } } pruefeEigeneDatenpunkte();
-
Das war tatsächlich die Lösung!
Vielen Dank für die schnelle Hilfe!
Seltsamerweise funktioniert das var bei allen anderen Scripten die ich mir zusammengebaut habe.
Werde diese vorsorglich nun abändern.Thema kann geschlossen werden.
-
@manolo sagte in Script funktioniert nur bedingt:
Seltsamerweise funktioniert das var bei allen anderen Scripten die ich mir zusammengebaut habe.
Das Problem ist ja hier, dass Du in der Callback-Funktion auf die Werte außerhalb der Funktion zugreifen möchtest. Und die sind dann halt global (wegen var) und nicht nur im Block-Scope der Schleife gültig.
Einfach
var
vermeiden. -
@manolo sagte in Script funktioniert nur bedingt:
Thema kann geschlossen werden.
Das kannst nur Du, indem Du den Eingangspost bearbeitest und ein "[gelöst] - " vor den Titel setzt.