Ich muss this
von meinem setInterval
Handler aus zugreifen
prefs: null,
startup : function()
{
// init prefs
...
this.retrieve_rate();
this.intervalID = setInterval(this.retrieve_rate, this.INTERVAL);
},
retrieve_rate : function()
{
var ajax = null;
ajax = new XMLHttpRequest();
ajax.open('GET', 'http://xyz.com', true);
ajax.onload = function()
{
// access prefs here
}
}
Wie kann ich auf this.prefs zugreifen ajax.onload
?
javascript
this
setinterval
Pablo
quelle
quelle
self
der einzigen Option hier? Können Sie bestätigen, dass die Lösung von Matthew nicht funktioniert?this
als unnötiger und unangenehmer Parameter beinhaltete (jeder Aufrufer vonretrieve_rate
hätte diese unnötige spezielle Anforderung gekannt).this
als Argument an(function(self){...})(this)
in setInterval hat bei mir nicht funktioniert, da die Funktion sofort ausgeführt wird, anstatt verzögert zu werden. @ Joel Fillmores Lösung funktioniert für michthis.intervalID = setInterval(this.retrieve_rate.bind(this), this.INTERVAL);
quelle
_.bind
:this.intervalID = setInterval(_.bind(this.retrieve_rate, this), this.INTERVAL);
Das Standardverhalten von
setInterval
ist das Binden an den globalen Kontext. Sie können eine Mitgliedsfunktion aufrufen, indem Sie eine Kopie des aktuellen Kontexts speichern. Innerhalb von retrieve_rate wird diethis
Variable korrekt an den ursprünglichen Kontext gebunden. So würde Ihr Code aussehen:var self = this; this.intervalID = setInterval( function() { self.retrieve_rate(); }, this.INTERVAL);
Bonus-Tipp: Für eine einfache Funktionsreferenz (im Gegensatz zu einer Objektreferenz mit einer Elementfunktion) können Sie den Kontext mithilfe von JavaScript
call
oderapply
Methoden ändern .quelle
Mit Verbesserung der Browser - Unterstützung ist die Zeit nun gut , die verwenden EcmaScript 6 Erweiterung, auf die Pfeil -
=>
Methode , erhaltenthis
richtig.startup : function() { // init prefs ... this.retrieve_rate(); this.intervalID = setInterval( () => this.retrieve_rate(), this.INTERVAL); },
Mit der Methode => wird das
this
Wann beibehalten, dasretrieve_rate()
vom Intervall aufgerufen wird. Keine Notwendigkeit für funky Selbst oder Übergabethis
von Parameternquelle
window.setInterval(function(){console.log(this)}.bind(this), 100)
Dies ist legal in Javascript und spart viel Code :)
quelle
Dies wäre die sauberste Lösung, da Sie diesen Kontext die meiste Zeit tatsächlich für Ihre aufeinander folgenden Methodenaufrufe wechseln möchten:
Es ist auch einfacher, das Konzept von zu verstehen.
// store scope reference for our delegating method var that = this; setInterval(function() { // this would be changed here because of method scope, // but we still have a reference to that OURMETHODNAME.call(that); }, 200);
quelle
Bei modernen Browsern ermöglicht die setInterval-Methode zusätzliche Parameter, die nach Ablauf des Timers an die von func angegebene Funktion übergeben werden.
var intervalID = scope.setInterval (func, delay [, param1, param2, ...]);
Daher kann eine mögliche Lösung sein:
this.intervalID = setInterval(function (self) { self.retrieve_rate(); }, this.INTERVAL, this);
Eine Demo:
var timerId; document.querySelector('#clickMe').addEventListener('click', function(e) { timerId = setInterval(function (self) { self.textContent = self.textContent.slice(0, -1); if (self.textContent.length == 0) { clearInterval(timerId); self.textContent = 'end..'; } }, 250, this); })
<button id="clickMe">ClickMe</button>
quelle
prefs: null, startup : function() { // init prefs ... this.retrieve_rate(); var context = this; this.intervalID = setInterval(function() { context.retrieve_rate(); }, this.INTERVAL); }, retrieve_rate : function() { var ajax = null; ajax = new XMLHttpRequest(); ajax.open('GET', 'http://xyz.com', true); var context = this; ajax.onload = function() { // access prefs using context. // e.g. context.prefs } }
quelle
this
Innerhalb der an übergebenen FunktionsetInterval
wird auf das globale Objekt verwiesen. Meinten Siecontext.retrieve_rate
stattthis.retrieve_rate
?call
,context.retrieve_rate()
ist genug, da Sie eine haben Basisobjekt (context.
)Das ist keine Schönheitslösung, wird aber allgemein verwendet:
var self = this; var ajax = null; //... ajax.onload = function() { self.prefs....; }
quelle
setInterval
dieretrieve_rate
Funktionthis