Сохраните данные, полученные от анонимной функции в объекте класса - PullRequest
0 голосов
/ 10 мая 2011

Я пытаюсь сохранить данные, полученные от вызова API Facebook, в свойство класса.

Мой конструктор:

function Foo() {
    this.bar = {
        likes: 0
    };
}

Способ обновления объекта:

Foo.prototype.update = function() {
    FB.api('/me/likes', function (response) { 
        // this.bar['likes'] is out of the scope
    });

}


var foo = new Foo();
foo.update();

Возможно ли это или я должен просто попытаться сделать синхронный вызов? Я не уверен, поддерживает ли API Facebook это.

Спасибо

1 Ответ

2 голосов
/ 10 мая 2011
Foo.prototype.update = function()
{
    var self = this;
    FB.api('/me/likes', function (response){ 
        self.bar["likes"] = response;
    });

}

Если вы кешируете this как локальную переменную, вы можете ссылаться на нее внутри функции обратного вызова.

В качестве альтернативы вы можете использовать команду связывания ES5 или альтернативу jQuery $.proxy.или альтернатива подчеркивания _.bind

FB.api('/me/likes', (function (response){ 
    this.bar["likes"] = response;
}).bind(this));

FB.api('/me/likes', $.proxy(function (response){ 
    this.bar["likes"] = response;
}, this));

FB.api('/me/likes', _.bind(function (response){ 
    this.bar["likes"] = response;
}, this));

Все это гарантирует, что значение this в вашей функции соответствует ожидаемому.(обратите внимание, что .bind - это ES5 и ломается в старых браузерах).

Если у вас лежит jQuery, вы можете использовать $ .proxy.Если вы не хотите включать jQuery, используйте вместо этого подчеркивание, потому что оно намного меньше

...