2016-05-11 7 views
0

Ich habe eine Prototyp-Klasse von Bot gemacht. Mein Problem ist, nachdem ich es erstellt habe, nenne ich es init(). Es gibt diesen Wert "a 5000" in einer Warnung korrekt zurück. Wenn diese Prototyp-Funktion getUpdates() aufruft, erreicht sie jedoch nicht mehr diesen Wert und gibt "b undefined" an. Ich habe es selbst versucht. im Konstruktor aber kein Glück.Problem mit dem Aufruf einer Prototyp-Funktion mit setInterval

Nach dem Kämpfen habe ich gefunden, adding() auf den Aufruf von self.getUpdates im SetInterval hat es den Wert richtig bekommen, dann ein anderes Problem, SetInterval nur einmal Schleifen. Ich habe versucht, ein setTimeout zu machen und es sich selbst in getUpdates aufrufen, aber habe "zu viel Rekursion script.js: 30: 1". Ich habe manchmal "abgefangene Ausnahme: out of memory"

Ich war ursprünglich mit "var privateVars < -> this.methods" ohne viel Problem, aber die Einstellung "this.publicVars < -> Class.prototype.methods" seit ich gelesen habe, sollen sie schneller und weniger Speicher sein, aber diese Prototyp-Methode gibt mir Probleme. Ich habe versucht, Google zu durchsuchen, aber kein Glück. Ich würde es vorziehen, den Timer bei init() zu starten.

Hier ist mein Code:

var Bot = function() { 
    "use strict"; 
    this.updateInterval = 5000; 
    this.updateTimer = null; 
}; 
Bot.prototype.getUpdates = function() { 
    "use strict"; 
    var self = this; 
    alert("b " + self.updateInterval); // returns "b undefined" 
}; 
Bot.prototype.init = function() { 
    "use strict"; 
    var self = this; 
    $.get(/* pretend url is here*/, function (data, status) { 
     alert("a " + self.updateInterval); // returns "a 5000" 
     self.updateTimer = setInterval(self.getUpdates, self.updateInterval); 
    }); 
}; 
window.bot = new Bot(); 
window.bot.init(); 

Jede Hilfe oder Rat geschätzt würde. Aber ich denke Prototyp ist nicht der Weg zu gehen, wenn es Timer enthält.

Antwort

1

Sie haben den this Kontext richtig auf die Funktion Bezug auf bind,

self.updateTimer = setInterval(self.getUpdates.bind(self), self.updateInterval); 

Wenn Sie den Kontext nicht binden explizit dann der this Kontext innerhalb von getUpdates zu Fenstern zeigen würde. So wird window.updateIntervalundefined sein.

0

können Sie bind verwenden, um die this Kontext in Ihrer getUpdates Funktion einzustellen: Referenz von Bot auf die getUpdates Funktion

self.updateTimer = setInterval(self.getUpdates.bind(self), self.updateInterval); 

Working example

0

Sie die this schicken.

Bot.prototype.getUpdates = function (self) { 
    "use strict"; 
    alert("b " + self.updateInterval); 
}; 
Bot.prototype.init = function() { 
    "use strict"; 
    var self = this; 
    $.get(/* pretend url is here*/, function (data, status) { 
     alert("a " + self.updateInterval); 
     self.updateTimer = setInterval(self.getUpdates(self), self.updateInterval); 
    }); 
}; 
+0

Sowohl @Rajaprabhu Aravindasamy und @Razzi Abuissa Antworten geholfen, das Problem zu lösen, erwartete keine Antwort so schnell, danke. @Ramin Antwort hat jedoch nicht funktioniert, setInterval nur einmal für mich ausgelöst, aber danke für den Versuch. Gibt es andere Möglichkeiten, auf die Prototyp-Methoden der Klasse zuzugreifen, und diese Werte wie eine Set-Wurzel, ohne dass sie "Fenster" annimmt? Say innerhalb von mehreren Funktionen genannt werden, aber immer noch wissen, "das" bezieht sich auf oder wenn möglich ohne es? – Nova

+0

Das ist richtig @Nova, der beste Weg ist, wie Rajaprabhu und Razzi vorgeschlagen haben, damit es keinen Overhead geben würde, die Botfunktionsreferenz an alle anderen Funktionen zu senden. Daumen hoch für sie. Wenn Sie jedoch von überall auf die Bot-Funktionsreferenz zugreifen möchten, können Sie ihren Bezug auf eine Variable in einem Fensterobjekt wie diesem 'window.botReference = this;' innerhalb der Bot-Funktion zuweisen. – Ramin

Verwandte Themen