NEWS
Anzahl Datenpunkte geändert - wie Trigger anpassen?
-
Ich habe in einem Skript einen Trigger auf alle Datenpunkte eines Adapters gesetzt, und zwar wie folgt:
// Und eine weitere Subscription auf "life.360.0.myplaces.*.*.isPresent" $(dp_myplaces + ".*.*.isPresent").on( function (obj) { //on({ id: dp_circle + ".*.membersPresent", change: "ne" }, function (obj) { var value = obj.state.val; if (value == true) { MyPlaces_AssignPeopleAndPlaces(obj.id); } });
Wenn ich nun in der Life360 App einen weiteren Ort erstelle so scheint der Adapter dies auch zeitnah mitzubekommen. Aber mein Skript nicht. Der Adapter erstellt den neuen Ort (und müsste sofort festgestellt haben das dort jemand "Present" ist, mein Skript bekam das aber erst nach einem Neustart raus.
Ich vermute weil die neuen Datenpunkte halt noch nicht im Trigger / Subscription waren.Also, wie löst man das am besten?
-
@bananajoe sagte: die neuen Datenpunkte halt noch nicht im Trigger / Subscription waren.
Die neuen Datenpunkte sind noch nicht im Puffer der Javascript-Instanz.
@bananajoe sagte in Anzahl Datenpunkte geändert - wie Trigger anpassen?:
wie löst man das am besten?
Mit
on(RegExp, function(dp) {});
anstelle des Selektors.
on(/^life360\.0\.myplaces\..+\.isPresent$/, function(dp) {
-
@paul53 sagte in Anzahl Datenpunkte geändert - wie Trigger anpassen?:
on(RegExp, function(dp) {});
Also so etwa?
// Pfad mit dem Kreis der Überwacht werden soll. Den "channel" unterhalb von life360.x.circles der Überwacht werden soll const dp_circle = "life360.0.circles.8a95a98d-adb3-4df4-bb0c-e374f4f8f161"; var on_dp_circle = "/^" + dp_circle + "\..+\.membersPresent$/" on(on_dp_circle , function(dp) { var value = obj.state.val; if (value == true) { MyPlaces_AssignPeopleAndPlaces(obj.id); });
Ich hab gesehen das du hier im Forum schon oft Fragen dazu beantwortest hast.
ich bin mir nicht sicher bezüglich der Schreibweisen und ob ich das wie oben stehend verketten kann:/^ muss Anfangen mit \.. eine beliebige Anzahl von Zeichen (war das nicht ein Punkt?) + muss mindestens einmal vorkommen? $/ Zeichenkettenende / Zeilenende?
Ich nutze sonst den RegExBuddy - aber da muss ich das passende Verfahren einstellen, das wäre dann JavaScript? die / und \ verwirren mich ein wenig
-
@bananajoe sagte: Also so etwa?
Nein, RegExp ist kein String, also funktioniert auch keine String-Verkettung. Wie man RegExp verkettet, entzieht sich meiner Kenntnis.
@bananajoe sagte in Anzahl Datenpunkte geändert - wie Trigger anpassen?:
die / und \ verwirren mich ein wenig
/ markieren Anfang und Ende eines RegExp. \ vor einem Punkt meinen den Punkt selbst, da der Punkt im RegExp sonst eine besondere Bedeutung hat (beliebiges Zeichen).
-
@paul53 also müsste ich das hart-verdrahtet in das Skript packen.
Ich schau mal ob ich noch was dazu finde - aber schon mal vielen Dank -
const dp_circle = "life360\.0\.circles\.8a95a98d-adb3-4df4-bb0c-e374f4f8f161"; var on_dp_circle = "/^" + dp_circle + "\..+\.membersPresent$/"
oder ne Funktion:
const dp_circle = "life360.0.circles.8a95a98d-adb3-4df4-bb0c-e374f4f8f161"; let r = getRegEx(dp_circle, '^'); r += '.*\.membersPresent$'; on({ id: new RegExp(r), change: 'ne' }, ...) function getRegEx(value, firstChar) { let path = value.split('.'); if (value[value.length-1] == '.') path.splice(path.length-1,1); let r = ''; if (firstChar !== undefined) r+=firstChar; for (let a=0;a<path.length;a++) { if (path[a]) r+=path[a]+'\.'; } return r; }
-
@ticaki irgendwie ist die Antwort nicht ganz so wie du diese erstellen wolltest - glaube ich.
Zumindest scheinst du diese wieder geändert zu haben.Die Function macht was? Ermittelt die vorhandenen Datenpunkte einzeln? Und die On Springt an wenn einer dazu kommt? oder gelöscht wird?
-
@bananajoe
Hallo, war gestern etwas zu müde. Ich hatte zuerst vorgeschlagen das du mit einem schedule überprüft ob sich$(dp_myplaces + ".*.*.isPresent")
verändert und wenn ja, das Skript neu startest.
var oldDps = $(dp_myplaces + ".*.*.isPresent"); schedule('*/5 * * * *', function() { if (JSON.stringify(oldDps) != JSON.stringify($(dp_myplaces + ".*.*.isPresent"))) restartScript(); })
Dann gesehen das RegEx neue Datenpunkt erfasst, und weil du mit dem /\ durcheinanderkommst. dir meine Funktion hier rein kopiert die jeden Punkt in einem Datenpunkt gegen
\.
tauscht.
RegEx findet keine gelöschten Datenpunkte soweit mir bekannt, sondern nur neue.