NEWS
[Gelöst] On() in schleife
-
@dwm:Servus,
Du musst im Handler die obj.id abfragen und daraus das tTrg bauen…
for a 1 to 10...... var tSrc = ""; tSrc = "sonoff.0.Aqua" + a + ".POWER" + b ; on (tSrc, function(obj) {ActorStateChange(obj, 'Aqua.'+obj.id.replace(/sonoff.0.(\w+)/,'$1')+'.State' );}); }
Im Grunde würd ich den tTrg Parameter glaub ich rauswerfen und aus obj.id bauen, weil redundant … das regex kriegt man auch sicher eleganter hin.
CU `
Ne, sind nicht gleich. Sieht aber fast so ausDas eine ist die SrcID vom Gerät auf das ich reagiere, tScc ist an ganz anderer stelle in dem ich den Wert spiegel bzw. weiter bearbeite. Über das Objekt komme ich da nicht ran, ganz anderer Zweig.
-
Deswegen steht ja auch
'Aqua.'+obj.id.replace(/sonoff.0.(\w+)/,'$1')+'.State'
drin, der das eine in das andere umschnurgelt
Testcode:
var id = 'sonoff.0.Aqua1.POWER1'; console.log ('Aqua.'+id.replace(/sonoff.0.(\w+)/,'$1')+'.State');
-
@dwm:Deswegen steht ja auch
'Aqua.'+obj.id.replace(/sonoff.0.(\w+)/,'$1')+'.State'
drin, der das eine in das andere umschnurgelt
Testcode:
var id = 'sonoff.0.Aqua1.POWER1'; console.log ('Aqua.'+id.replace(/sonoff.0.(\w+)/,'$1')+'.State'); ```` `
Ja, das passt für dieses Beispiel. Da hast du recht. Aber es war nur ein Beispiel. ich hätte das mit einem völlig anderen Ziel schreiben sollen. Das Ziel ist absolut variabel und nicht aus der Quelle ableitbar. Aber dein Ansatz ist für den ableitbaren Fall sehr gut. Nur löst es mein Problem nicht. Ich werde mir das mal mit dem "let" ansehen.
-
let bringt Dich da nicht weiter;)
Bei absolut variablem Ziel könnte entweder wirklich ein array helfen, mit dem Du die Zuweisung obj.id => target.id definierst, oder
Du benutzt bind … das dann zwar grundsätzlich für jeden Schleifendurchlauf einen "Klon" der Funktion für die jeweiligen Parameter definiert aber
halt die Parameter festtackert...
for a 1 to 10...... var tSrc = ""; var tTrg = ""; tSrc = "sonoff.0.Aqua" + a + ".POWER" + b ; tTrg = "'Aqua.Aqua" + a + ".POWER" + b ".State' on (tSrc, function(obj) {ActorStateChange.bind(obj, tTrg );}); }
-
@dwm:let bringt Dich da nicht weiter;) `
Wenn ich das beim Lesen richtig gesehen habe, bringt let dich hier weiter. var ist nicht blockbezogen, d.h. es macht keinen Unterschied ob du die Variablen vor oder nach der Schleife definierst. Zum Zeitpunkt des callback-Aufrufs haben sie den letzten zugewiesenen Wert (a = 10).let bzw const (da keine Änderung in der Schleife stattfindet) ist blockbezogen (und bei Schleifen sogar Loop-bezogen). Du hast sozusagen eine eigene Kopie der Variable pro Schleifendurchlauf. So müsste es funktionieren:
for (let a = 1; a <= 10; a++) { const tSrc = "sonoff.0.Aqua" + a + ".POWER" + b; const tTrg = "Aqua.Aqua" + a + ".POWER" + b ".State" ; on(tSrc, (obj) => ActorStateChange(obj, tTrg) ); }
-
Es sollen 10 Subscriptions on() erzeugt werden. Versuche es mal so:
const ons = []; for (let a = 1; a <= 10; a++) { const tSrc = "sonoff.0.Aqua" + a + ".POWER" + b; const tTrg = "Aqua.Aqua" + a + ".POWER" + b + ".State" ; ons.push(on(tSrc, (obj) => ActorStateChange(obj, tTrg))); }
-
Es sollen 10 Subscriptions on() erzeugt werden. Versuche es mal so: `
oder ganz fancy (kann sein dass Node6 benötigt wird:const subscriptions = Array(10).fill().map((_, i) => i + 1).map(a => { const tSrc = `sonoff.0.Aqua${a}.POWER${b}`; const tTrg = `Aqua.Aqua${a}.POWER${b}.State`; return on(tSrc, (obj) => ActorStateChange(obj, tTrg)); });
-
oder ganz fancy `
Das Ergebnis sollte das gleiche sein, nur versteht das kein Einsteiger (wie ich). -
Das Ergebnis sollte das gleiche sein, nur versteht das kein Einsteiger (wie ich). `
Zugegeben, bis "map(a =>" musste ich selbst nachschauen :oops: Habe mir nur gedacht, anstatt in einer Schleife in ein Array zu pushen, müsste es auch per map() gehen.
-
Wenn ich das beim Lesen richtig gesehen habe, bringt let dich hier weiter. var ist nicht blockbezogen, d.h. es macht keinen Unterschied
const tSrc = "sonoff.0.Aqua" + a + ".POWER" + b;
const tTrg = "Aqua.Aqua" + a + ".POWER" + b ".State" ; `
Das funktioniert einwandfrei! Letztendlich aus var -> const.
Vielen Dank!