Javascript setInterval и 'это' решение

Я должен получить доступ this от моего setInterval обработчик

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
        }
    }

Как я могу получить доступ к this.prefs в ajax.onload ?

61
задан Pablo 1 May 2010 в 08:01
поделиться

3 ответа

Строка setInterval должна выглядеть так: -

 this.intervalID = setInterval(
     (function(self) {         //Self-executing func which takes 'this' as self
         return function() {   //Return a function in the context of 'self'
             self.retrieve_rate(); //Thing you wanted to run as non-window 'this'
         }
     })(this),
     this.INTERVAL     //normal interval, 'this' scope not impacted here.
 ); 

Edit : Тот же принцип применяется к " onload " . В этом случае обычно "внешний" код мало что делает, он просто устанавливает запрос, а затем отправляет его. В этом случае дополнительные накладные расходы на дополнительную функцию, как в приведенном выше коде, не нужны. Ваш retrieve_rate должен выглядеть примерно так: -

retrieve_rate : function()
{
    var self = this;
    var ajax = new XMLHttpRequest();
    ajax.open('GET', 'http://xyz.com', true);
    ajax.onreadystatechanged= function()
    {
        if (ajax.readyState == 4 && ajax.status == 200)
        {
            // prefs available as self.prefs
        }
    }
    ajax.send(null);
}
86
ответ дан 24 November 2019 в 16:58
поделиться
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
        }
    }
0
ответ дан 24 November 2019 в 16:58
поделиться

Это не изящное решение, но оно широко используется:

var self = this;
var ajax = null;
//...
ajax.onload = function() {
    self.prefs....;
}
-1
ответ дан 24 November 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: