Prototype Class.create & Timeout

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Prototype Class.create & Timeout

    Hallo also ich spiele gerade ein wenig mit der Funktion Class.create aus dem Framework Prototype herrum.
    Klappt auch alles soweit. Nur frage ich mich, wie soll man bitte eine Unterfunktion mit einem Timeout definieren?
    Also mal ein Beispiel:

    Quellcode

    1. var test = {}
    2. test = Class.create({
    3. initialize: function(){
    4. this.wert =0;
    5. },
    6. start: function(){
    7. alert(this.wert);
    8. pe =setTimeout(function() { [color=#ff0000]??? [/color]}, 1000);
    9. }
    10. });
    11. var check=new test();
    Alles anzeigen


    Also anstelle der Fragezeichen habe ich schon es schon so probiert:

    Quellcode

    1. this.start()
    Das funktioniert aber nicht.

    Wenn ich es mit check.start(); aufrufe, funktioniert das ganze zwar...aber ich hätte gerne, dass die Klasse unabhängig von dem Namen der Variablen ist, die die Klasse aufruft.

    Also das heißt ja, wenn ich das so definieren würde:

    Quellcode

    1. pe =setTimeout(function() {check.start(); }, 1000);


    Dann müsste ich das ganze ja immer zwangsläufig mit var check= .... definieren.
    Ich hoffe ihr versteht was ich meine. Und es kennt sich überhaupt hier jemand mit Prototype aus.

    Danke im Vorraus. :)



    Edit:// OKay also wenn ich das ganze so aufrufe,

    Quellcode

    1. pe =setTimeout(this.start(), 1000);


    Funktioniert das so halb. Entweder hängt sich Firefox auf, oder aber die Funktion wird nicht im 1sek Takt aufgerufen, sondern immerweiter hintereinander.



    Rufe ich das ganze wiederrum so auf:

    Quellcode

    1. this.start.bind('test')


    Funktioniert das ganze.
    Will ich mir nur den übergebenen Wert test in der funktion "start:" ausgeben lassen, erhalte ich nur zahlen.
    Ich steige durch diese funktion "bind" von prototype iwie nicht so durch.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Snowflake ()

  • Okay da das ganze schon durcheinander genug ist, mach ich mal eine zweite Antwort.


    Also die Lösung lautet:

    Quellcode

    1. setTimeout(this.start.bind(this), this.delay * 1000);


    Ich hätte gerne noch einen Wert übergeben
    Sprich this.start('wert')

    Geht aber vllt gar nicht. Deswegen habe ich mir einfach eine Variable im "initialize" Part definiert, wo der Wert drin gespeichert wird.
  • Snowflake schrieb:

    Okay da das ganze schon durcheinander genug ist, mach ich mal eine zweite Antwort.


    durcheinander? du sagst es... was willst du denn überhaupt erreichen ;)
    setTimeout ist übrigens eine void - musst du also keiner Variablen zuweisen (die definierst du auch global, wodurch mehrere Instanzen sowieso nicht möglich wären)
  • Ja ich habe gemerkt, dass das ganze was durcheinander geworden ist sorry.


    Also ich habe vor, via Timeout die unterfunktion start: in der klasse aufzurufen, und würde dabei gerne noch einen wert übergeben, bei dem timeout.
    Also bei einer normalen Funktion würde man das ja so aufrufen

    Quellcode

    1. setTimeout(start(var), 1000);


    Nur geht das mit "start:" nicht so wirklich. Also habe ich es mit

    Quellcode

    1. setTimeout(this.start(var), 1000);
    probiert, was aber nicht klappt.
    Es funktioniert nur ohne das var in der klammer.
  • Mehrere Probleme:
    Also eigentlich musst du die Funktionsreferenz übergeben: sowas wie this.start.
    Wenn du stattdessen this.start() verwendest, dann wird die Funktion erstens sofort ausgeführt und zweitens die Rückgabe des Funktionsaufrufes an den Timer übergeben.

    Außerdem gehört die Methode setTimeout dem Window Objekt.
    Wenn du also aus diesem "Scope" auf this zugreifst, erreichst du das window Objekt, statt der Klasse test.

    Die Lösung dafür findest du hier:
    codingforums.com/showpost.php?p=257817&postcount=4

    Quellcode

    1. //some object constructor
    2. function someObjectConstructor()
    3. {
    4. //create a test variable
    5. this.test = 'hello world';
    6. //create a global [within this scope] reference to this
    7. var self = this;
    8. //start an anonymous timer
    9. this.timer = window.setInterval(function()
    10. {
    11. alert(self.test); //"hello world"
    12. alert(self.timer); //a reference to this timer
    13. }, 5000);
    14. };
    Alles anzeigen


    Wenn du mit Prototype arbeitest, solltest du aber besser deren Implementierung des Timers verwenden: delay

    Ich hoffe die Fingerdeuts helfen dir weiter eine konkrete Lösung zu bauen. Ich habe gerade kein Beispiel parat.