@jens.maus:
Es geht hier natürlich um die Entwicklung eines eigenen Adapters, dort gibt es nicht setState() sondern eben "adapter.setState()" genauso wie "adapter.getState()" und das verhält sich leider auch etwas anders, denn es ist immer asynchron sodass sowas z.B. nicht zu funktionieren scheint:
for(var i=0; i < 100; i++) {
var newval = i;
var stateName = "test." + i;
adapter.getState(stateName, function(err, state) {
if(state.val != newval)
adapter.setState(stateName, {ack: true, val: newval);
});
}
Das Problem hierbei ist, wie gesagt, das adapter.getState() asynchron ist und somit "newval" und "stateName" innerhalb der anyonmen Funktion die an adapter.getState() übergeben wird zur Ausführungszeit leider die falschen werte hat. Zumindest ist das hier gerade der Fall. `
Bin ein bisschen spät mit der Antwort, aber vielleicht hilft es ja noch zum Verständnis. Bluefox hat dir eine recht elegante Version geschrieben, die sequentiell abläuft. Man kann das Problem aber auch lösen, indem man innerhalb der Schleife eine Funktion definiert, die die Schleifenvariable kapselt -> Stichwort Closure.
for(var i=0; i < 100; i++) {
// Hier beginnt die umhüllende Funktion
(function(i) {
// Der Wert von i ändert sich innerhalb dieser Funktion nicht mehr, er ist gekapselt
var newval = i;
var stateName = "test." + i;
adapter.getState(stateName, function(err, state) {
if(state.val != newval)
adapter.setState(stateName, {ack: true, val: newval);
});
// und hier wird die Funktion aufgerufen und der aktuelle Wert der Schleifenvariable übergeben
})(i);
}
Der Code ist ungetestet, sollte aber laufen. Ich hoffe, ich habe mich jetzt nicht vertippt.