NEWS
Problem mit globalen Scripten
-
Hallo,
Ich hab inzwischen alles versucht, komme aber nicht weiter. Ich habe mehrere globale Scripte, die voneinander abhängen. Das erste soll callbacks verwalten:
interface Subscription { (sender: object, source:string):void }
class SubscriptionManager { private callbacks:Subscription[]; public Subscribe(callback:Subscription) { if(this.callbacks.indexOf(callback) == -1) { this.callbacks.push(callback); } } public Unubscribe(callback:Subscription) { var index = (this.callbacks.indexOf(callback)); if(index != -1) { delete this.callbacks[index]; } } public Notify(sender: object, source:string) { for(let callback of this.callbacks) { callback(sender, source); } } constructor() { this.callbacks = []; } }
Mit Subscribe() kann man sich auf events anmelden, mit Notify() ein Event senden. Dann habe ich diverse weiter Scripte, um Komponten zu abstrahieren. Sowas hier z. B.:
class Switch { public static readonly STATE:string = "state"; private suffixes:string[] = ['.STATE', '.state' ,'.1.STATE', '']; private nodeState:string; private subscriptionManager:SubscriptionManager; public get S():SubscriptionManager { return this.subscriptionManager} public get State():boolean { return getState(this.nodeState).val; } public set State(value:boolean) { setState(this.nodeState, value); } constructor(address:string) { this.subscriptionManager = new SubscriptionManager(); for(let suffix of this.suffixes) { this.nodeState = address + suffix; var node = getState(this.nodeState) var exists = !node.notExist; if(exists && typeof node.val === "boolean") { on(this.nodeState, this.OnStateChanged.bind(this) ); break; } } } private OnStateChanged():void { this.subscriptionManager.Notify(this, Switch.STATE); } }
Man kann also die Adresse von einem Schalter reinwerfen, und sich dann darauf Subscriben. Dazu habe ich weitere Controller-Klassen, die z. B. Switch-Instanzen mit weiteren Klassen (z. B. LightSource für Licht) verbinden.
Ich bekomme leider viele Fehler wie diese hier:
```
private subscriptionManager:SubscriptionManager; ^ ERROR: Cannot find name 'SubscriptionManager'. public get S():SubscriptionManager { return this.subscriptionManager} ^ ERROR: Cannot find name 'SubscriptionManager'. this.subscriptionManager = new SubscriptionManager(); ^ ERROR: Cannot find name 'SubscriptionManager'. public get S():SubscriptionManager { return this.subscriptionManager} ^ ERROR: Return type of public getter 'S' from exported class has or is using private name 'SubscriptionManager'.
Funktionieren tut das ganze komischerweise trotzdem, allerdings nur mit einer alten Version vom javascript-Adapter. Mache ich ein Update, starten die Scripte aufgrund der Fehlermeldungen nicht. Konkret gibt es Probleme, sobald im Adapter eine Abhängigkeit von virtual-tsc 5.0 gibt, mit 4.6 läuft alles. Ich benutze noch den Javascript Adapter 4.6.14, den ich mir auf virtual-tsc 4.6 "umgehackt" habe. Bei neueren Versionen geht das leider nicht mehr so einfach, daher verhindert das Problem ein Update des Javascript-Adapters.
Hat jemand eine Idee, der sich besser mit Java-/Typescript auskennt? Ich komme eher aus der C++/C#-Ecke ...
-
@da-phreak Ich würde wohl nicht Abhängigkeiten zwischen globalen Skripten machen. Ich versuche dort nur helper, Basisklassen oder Konstanten zu definieren. In meinen (normalen) Skripten deklariere ich oben die Klassen und unten instanziere ich sie dann.
-
Hmmm, ok. Ich dachte genau dazu sind Scripte gut, die in global liegen. Dann müßte ich das händisch vor jedes Script kopieren. Mit allen Nachteilen ... wenn ich was ändern möchte, muß ich es wieder in alle anderen Scripte reinkopieren.
Wenn es nicht anderes geht, kann ich es natürlich so machen.
-
@da-phreak sagte in Problem mit globalen Scripten:
Ich dachte genau dazu sind Scripte gut, die in global liegen.
Ja, absolut, aber wie sollen Abhängigkeiten zwischen globalen Skripten aufgelöst werden? Deshalb würde ich zwischen den globalen Skripten keine Abhängigkeiten machen.
-
Ok, ist schon eine starke Einschränkung. Dann muß ich nochmal drüber nachdenken, wie ich das mache, da findet sich sicher ein Weg. Immer wieder reinkopieren ist wirklich unschön.
-
So, alle Abhängigkeiten entfernt, nu läuft es. Ich gebe nun alle Abhängigkeiten per Constructor-injection rein, in den global-Scripten speichere ich das dann einfach als :any. Nicht schön, aber was soll man machen,
-
Globale Skripte können Abhängigkeiten untereinander haben. Es ist aber äußerst unintuitiv, in welcher Reihenfolge diese aneinandergehängt werden. Ich glaube es geht nach der Reihenfolge, mit der die Objekte erstellt wurden oder sowas komisches.
Bei dem Aufbau würde ich eher alle globale Grundfunktionalität sowie die Abstraktionen ins selbe globale Skript packen.
@da-phreak sagte in Problem mit globalen Scripten:
Konkret gibt es Probleme, sobald im Adapter eine Abhängigkeit von virtual-tsc 5.0 gibt, mit 4.6 läuft alles. Ich benutze noch den Javascript Adapter 4.6.14, den ich mir auf virtual-tsc 4.6 "umgehackt" habe. Bei neueren Versionen geht das leider nicht mehr so einfach, daher verhindert das Problem ein Update des Javascript-Adapters.
Und warum berichtest du sowas nicht auf Github, damit man das sieht und beheben kann?
-
@AlCalzone Ok, wenn die Reihenfolge mehr oder wenig zufällig ist, ist es wohl das beste, Abhängigkeiten zu vermeiden.
Ich wollte schon auf Github melden. Zum einen war ich mir nicht sicher, wo, javascript oder virtual-tsc. Zum anderen habe ich versucht, das ganze in einer VM reproduzierbar zu machen. Das ist mir leider nicht gelungen, und ich kenn das ja selber, Bug Reports, die nicht reproduzierbar sind, bringen meist nichts.
-
@da-phreak Im Zweifel beim Adapter