Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 16 bis 30 von 44
  1. #16
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Keine sequentelle Ausführung geladener JS-Module

    und noch was, da ich sehe das du stack anscheinend auch global definierst, du weißt, dass var stack eine lokale Kopie erzeugt und nichts mit mehr der globalen Variabel zu tun hat?

  2. #17
    bis
    bis ist offline Routinier
    registriert
    09-09-2009
    Beiträge
    459

    AW: Keine sequentelle Ausführung geladener JS-Module

    Zitat Zitat von ein schlauer Beitrag anzeigen
    und noch was, da ich sehe das du stack anscheinend auch global definierst, du weißt, dass var stack eine lokale Kopie erzeugt und nichts mit mehr der globalen Variabel zu tun hat?
    Nicht auch, sondern nur global. Diese Var wird ja nur einmal gebildet in ECVar. Es gibt keine nicht-globalen InstVars sonst mit diesem Namen.

  3. #18
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Keine sequentelle Ausführung geladener JS-Module

    Ach stimmt, ich hab stack mit page verwechselt.

    Jetzt kriege ich Fehlermeldungen weil du anscheinend eine Callback Funktion nicht übergibst.
    PHP-Code:
    Fehlerfn is undefined
    Quelldatei
    http://www.elecat.com/reader30/ext-all-debug-Reader.js
    Zeile10907 

  4. #19
    bis
    bis ist offline Routinier
    registriert
    09-09-2009
    Beiträge
    459

    AW: Keine sequentelle Ausführung geladener JS-Module

    Zitat Zitat von ein schlauer Beitrag anzeigen
    Ach stimmt, ich hab stack mit page verwechselt.

    Jetzt kriege ich Fehlermeldungen weil du anscheinend eine Callback Funktion nicht übergibst.
    PHP-Code:
    Fehlerfn is undefined
    Quelldatei
    http://www.elecat.com/reader30/ext-all-debug-Reader.js
    Zeile10907 
    Nein, das kommt ebenso oft vor. Gleiches Thema

    fn ist in Ext definiert und das wird ganz am Anfang geladen. Bei mir gibt es keine solche Funktion.

  5. #20
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Keine sequentelle Ausführung geladener JS-Module

    fn ist der Parameter der irgendwo übergeben worden ist, an diese Funktion. Es ist eine callbackfunktion

  6. #21
    bis
    bis ist offline Routinier
    registriert
    09-09-2009
    Beiträge
    459

    AW: Keine sequentelle Ausführung geladener JS-Module

    Ich habe aber gerade entdeckt, daß es in der Ext lib die lokale Var "stack" gibt, die mehrfach nur über "this.stack" angesprochen wird.

    Aber das dürfte sich ja mit meiner globalen Var nicht beißen. Werde es trotzdem später umbenennen.

  7. #22
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Keine sequentelle Ausführung geladener JS-Module

    Ich krieg jetzt wieder das:
    PHP-Code:
    Fehlerthis.importFromCatIniStore is not a function
    Quelldateihttp://www.elecat.com/reader30/ECCatalog.js
    Zeile333 
    das ist eindeutig. this ist in dieser Funktion nicht das Objekt, was du erwartest. Lass dir mal this anzeigen. Du hast massive Probleme mit dem Eventhandling. Wenn du eine callback Funktion in einem Event aufrufst läuft diese im Kontext des aufrufendem Objektes, nicht unbedingt dort wo sie definiert wird.

  8. #23
    bis
    bis ist offline Routinier
    registriert
    09-09-2009
    Beiträge
    459

    AW: Keine sequentelle Ausführung geladener JS-Module

    Zitat Zitat von ein schlauer Beitrag anzeigen
    Ich krieg jetzt wieder das:
    PHP-Code:
    Fehlerthis.importFromCatIniStore is not a function
    Quelldateihttp://www.elecat.com/reader30/ECCatalog.js
    Zeile333 
    das ist eindeutig. this ist in dieser Funktion nicht das Objekt, was du erwartest. Lass dir mal this anzeigen. Du hast massive Probleme mit dem Eventhandling. Wenn du eine callback Funktion in einem Event aufrufst läuft diese im Kontext des aufrufendem Objektes, nicht unbedingt dort wo sie definiert wird.
    Ja, ich hatte das schon vorher bemerkt. Das ist die Post-Load Funktion, die sich auf die selbe Instanz beziehen soll wie der Load-Vorgang selbst.

    Code:
    ECCatalog.prototype.ecCatalogIniStore = function(url){
    		stack.add('ECCatalog start ecCatalogIniStore');
    	    this.catStores['catIni'] = new Ext.data.Store({
    		reader: new Ext.ux.CSVReader({
    					idProperty:	'key',
    					root: 'rows',
    					fields: [{name: 'key'},
    							{name: 'value'}]
    	    }),
    		storeId: url,
    		autoLoad: true,
    		url: url,
    		listeners: {load: function(){
    				this.importFromCatIniStore();
    				app.setJobReady('#catalogIniReader');
    					}
    		}	//end listeners
        });
    	};
    Nach meinem Verständnis ist das richtig (und das wäre es in Smalltalk auch), aber nicht nach dem von JS! Das "denkt" irgendwie anders.

    Da muß ich mir noch was einfallen lassen. Problem ist, daß die Instanz, in der das abläuft, "draußen" nicht bekannt ist und es können mehrere parallel ablaufen.

  9. #24
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Keine sequentelle Ausführung geladener JS-Module

    this ist das this, was du zur Laufzeit an dieser Stelle hast, da kommt es darauf an, von wo diese Funktion aufgerufen wird. Das ist logisch, aber für JS Anfänger verwirrend. Das übliche vorgehen ist es eine lokale Kopie von this anzulegen und dort zu verwenden.

  10. #25
    bis
    bis ist offline Routinier
    registriert
    09-09-2009
    Beiträge
    459

    AW: Keine sequentelle Ausführung geladener JS-Module

    Zitat Zitat von ein schlauer Beitrag anzeigen
    this ist das this, was du zur Laufzeit an dieser Stelle hast, da kommt es darauf an, von wo diese Funktion aufgerufen wird. Das ist logisch, aber für JS Anfänger verwirrend. Das übliche vorgehen ist es eine lokale Kopie von this anzulegen und dort zu verwenden.
    Danke für den Tip. Genau das hatte ich bereits gemacht, aber noch nicht hochgeladen.

    Oben:
    myCat = this;
    und dann unten:

    {load: function(){
    myCat.importFromCatIniStore();

    Nur hier verhält sich JS anders, als ich es kenne.

  11. #26
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Keine sequentelle Ausführung geladener JS-Module

    Das hat was mit dem jeweiligen Kontext bzw. Scope zu tun. Wie gesagt, du hast hier eine Callbackfunktion, die in einem anderen Kontext ausgeführt wird.

    Und this ist immer der Kontext. Du machst sowas ähnliches:
    PHP-Code:
    function A() {
     
    this.callback = function() {alert(this); }
    }
    function 
    B() {
     
    this.event = function(callback) { callback();};
    }

    var 
    = new A();
    var 
    = new B();
    b.event(a.callback); 
    Was ist hier wohl das this im alert()?

  12. #27
    bis
    bis ist offline Routinier
    registriert
    09-09-2009
    Beiträge
    459

    AW: Keine sequentelle Ausführung geladener JS-Module

    Wahrscheinlich verstehe ich die Verwendung von Callbacks in JS falsch, aber in meiner Kenntnis aus ST (Smalltalk) bezieht sich das "this" (dort self) bei Codeblocks immer auf die Stelle, wo der Code gesetzt wurde. Das wird extrem häufig verwendet, in beiden Fällen also auf die jeweilige Funktion, wo es gesetzt wird A auf A und B auf B.

    Sonst wäre es ja unmöglich, beim Ausführenden dieser Funktion - und das könnten verschiedenste Klassen sein, den Empfänger (nämlich das Objekt, wo das gesetzt wurde) zu identifizieren. Das Problem habe ich nämlich dort konkret.

    Das kann aber auch daran liegen, daß Variablen in ST, die auf Instanzen zeigen (und das sind dort fast alle, denn sogar Strings sind "echte" Instanzen von Objekten), eben nur auf diese referieren und keine Kopien bilden. Das müßte man explizit vornehmen.

    Ich muß da reichlich umlernen. JS ist eine völlig andere Welt.
    (keine schönere)

  13. #28
    Avatar von Albu
    Albu ist offline Foren-Gott
    registriert
    04-07-2001
    Beiträge
    13.501

    AW: Keine sequentelle Ausführung geladener JS-Module

    Also so richtig den Unterschied zwischen Deinem anderen Thread und diesem kann ich jetzt nicht erkennen. Ich habe mir den Quellcode jetzt nicht komplett angeschaut, dazu ist er viel zu umfangreich und entspricht von der Formatierung her nicht meinen Ansprüchen (was das Lesen schwieriger macht), auch habe ich ihn nur im Firebug durchgeschaut, der leider kein Syntax-Highlighting macht.
    ABER, was ich entdeckt zu glauben habe ist das, was ich Dir schon im anderen Thread versucht habe zu erklären: Du kannst nicht einfach davon ausgehen, dass die Dateien in der Reihenfolge geladen werden, wie Du sie im HTML-Tag angibst. Je nachdem wie groß die Dateien sind, oder wie der Webserver Bock hat, liefert er die mal richtig und mal falsch aus. Genauso schlägt auch der Browser-Cache zu, der natürlich auch JS-Dateien speichert, beim ersten Durchlauf ist der Cache meinetwegen leer -> Du läufst auf einen Fehler; Beim Zweiten Durchlauf werden die Dateien aus dem Cache geholt -> richtige Reihenfolge, alles OK - ist jetzt nur ein Szenario, was mir so in den Kopf kommt, bei Deinen Erklärungen.

    Das solltest Du Dir abgewöhnen, auch im Sinne von Wiederverwendbarkeit, und Seiteneffekten (die Du gerade massiv bemerkst). Du befindest Dich hier im Web, hier wird !Quellcode! erst zur Laufzeit nachgeladen, die Annahme, dass bei Programmstart (nach Deiner Lesart: erstes Javascript läuft los) alles sofort zur Verfügung steht, dem ist eben nicht so. Es kann sogar sein, dass eine Datei von einem externen Webserver gar nicht geladen wird, weil der gerade down ist.

    Ich möchte deshalb nochmal ausdrücklich auf das onLoad Event hinweisen.

    @Callbacks: rein technisch gibt es schon einen Unterschied zwischen Events und Callbacks. Events funktionieren zwar wie Callbacks, aber sie werden aufgerufen, durch Ereignisse, die ausserhalb des implementierenden Programmes auftraten. Bei Callbacks übergebe ich einer Methode eine Funktion, die z.B. den Vergleichsoperator für einen eigenen Datentypen implementiert. Die Aufrufe der Callback-Funktion erfolgen also unmittelbar zwischen Methodenaufruf und enden vor der Rückkehr.
    1. Get people to play Space Taxi
    2. Sell real estates on neptun
    3. Profit!

    IE is not a browser, it is a scream.


    Outside of a dog, a book is man's best friend. Inside of a dog, it's too dark to read.

  14. #29
    bis
    bis ist offline Routinier
    registriert
    09-09-2009
    Beiträge
    459

    AW: Keine sequentelle Ausführung geladener JS-Module

    Zitat Zitat von Albu Beitrag anzeigen
    Also so richtig den Unterschied zwischen Deinem anderen Thread und diesem kann ich jetzt nicht erkennen.
    Hier geht es um JS-Dateien und nicht um CSV und Events.

    Also hier meine ich klar nachgewiesen zu haben, daß es mit der sequentiellen Ausführung der JS-Dateien so nicht stimmen kann. Variablen, die am Anfang deklariert und sogar benutzt werden, sollen angeblich hinterher nicht mehr existieren. Das kann nicht sein, es sei denn der Interpreter hat Fehler.

    Zitat Zitat von Albu Beitrag anzeigen
    Du kannst nicht einfach davon ausgehen, dass die Dateien in der Reihenfolge geladen werden, wie Du sie im HTML-Tag angibst.
    Du meinst die JS-Quellen? (Hier geht es nicht um die CSV-Dateien)

    Na wenn diese Reihenfolge nicht gilt, dann ist das aber ein fundamentaler Konstruktionsfehler des gesamten Systems. Gute Nacht! Dann kann man sich ja auf nichts verlassen.

    Ich werde morgen alle meine Dateien in eine packen und mal sehen, ob das immer noch auftritt. Ich werde berichten.


    Zitat Zitat von Albu Beitrag anzeigen
    Beim Zweiten Durchlauf werden die Dateien aus dem Cache geholt -> richtige Reihenfolge, alles OK - ist jetzt nur ein Szenario, was mir so in den Kopf kommt, bei Deinen Erklärungen.
    Nein, unmöglich, ich habe den Cache IMMER gelöscht vor jedem Neustart der App.

    Zitat Zitat von Albu Beitrag anzeigen
    Ich möchte deshalb nochmal ausdrücklich auf das onLoad Event hinweisen.
    Aber doch nicht für die JS-Quellen, um die es hier allein geht!
    (Oder doch?) onLoad für JS-Quellen, das habe ich noch nie gesehen und wofür soll das gut sein? Dann müßte man ja Quelle 5 anhalten können, bis 1-4 geladen sind. Das sollte der Interpreter doch wohl selbst können. Sonst wäre es ja Lotto, wann welche Quellen zur Verfügung stehen.

    Bei den CSV-Dateien ist das ja auch so mit onLoad implementiert.

    Danke jedenfalls und einen schönen Abend!
    Geändert von bis (11-09-2009 um 21:31 Uhr)

  15. #30
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Keine sequentelle Ausführung geladener JS-Module

    Zitat Zitat von bis Beitrag anzeigen
    Wahrscheinlich verstehe ich die Verwendung von Callbacks in JS falsch, aber in meiner Kenntnis aus ST (Smalltalk) bezieht sich das "this" (dort self) bei Codeblocks immer auf die Stelle, wo der Code gesetzt wurde. Das wird extrem häufig verwendet, in beiden Fällen also auf die jeweilige Funktion, wo es gesetzt wird A auf A und B auf B.
    Ich kenn leider smalltalk überhaupt nicht, weiß daher nicht woher deine Schwierigkeiten kommen. JS ist halt extrem flexibel, z.b. das Beispiel oben:
    PHP-Code:
    function A() {
     
    this.name 'A';
     
    this.callback = function() {alert(this.name); }
    }
    function 
    B() {
     
    this.name 'B';
     
    this.event = function(callback) { callback.call(this);};
    }

    var 
    = new A();
    var 
    = new B();
    b.event(a.callback); 
    Jetzt wird die Callbackfunktion im Kontext von B ausgeführt, also ist this B

    um die Funktion an A zu binden, wird oft eine bind Funktion benutzt:
    PHP-Code:
    Function.prototype.bind = function(obj) {
        var 
    self this;
        return function() { 
    self.call(obj); };
    }
    function 
    A() {
     
    this.name 'A';
     
    this.callback = function() {alert(this.name); }
    }
    function 
    B() {
     
    this.name 'B';
     
    this.event = function(callback) { callback();};
    }

    var 
    = new A();
    var 
    = new B();
    b.event(a.callback.bind(a)); 
    JS ist schon toll

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •