Ответ 1
ОК, я все понял. Мне потребовалось много времени и я читал много разных страниц. Я сказал, что хочу делать все сделки с обратными вызовами и закрытием. Сначала я расскажу о проблеме обратного вызова. Поскольку функция FB.api является асинхронной, вы никогда не знаете, когда она вернется. Вы можете остановить Javascript или установить таймер, но это ужасный способ сделать это. Вам нужен обратный вызов. Фактически FB.api использует обратный вызов. Это то, что анонимная функция является вторым параметром. То, что я сделал, это создать еще одну функцию, которая называется fbUser, и использовать обратный вызов. Вот что я сделал:
function startThis() {
var getUser = fbUser(function(model){
console.log(model);
startapp(model);
});
};
function fbUser(callback){
FB.api('/me', function(response){
callback(response);
});
}
Функция startThis вызывается при положительном ответе на автоответчик Facebook. Затем он вызывает функцию fbUser, которая имеет обратный вызов. Обратный вызов возвращает обратный вызов из функции FB.api. Поскольку startThis использует этот обратный вызов с возвращаемым значением, которое называется моделью, другой код не будет выполняться до тех пор, пока обратный вызов не вернется. Больше проблем undefined. Эти функции - только обертки, чтобы получить ответ Facebook на мои взгляды. Возможно, я добавил слишком много уровней абстракции, но если вы хотите передать ответ, это способ.
Во-вторых, я хотел передать этот ответ на другое представление. Например, один вид загружает базовую информацию (используя ответ от fbUser). Теперь я хочу передать это другому представлению, которое загружает фотографии (я знаю, что это не лучшие практики MVC, но с помощью Facebook у меня нет большого контроля над моделью). Проблема у меня была, хотя я не мог передать исходный ответ на следующее представление, потому что внутри функции обратного вызова для вызова FB.api this
относится к Window
, а не к объекту, в котором я был. Решение: закрытие, Я не буду объяснять это совершенно, но закрытие - это локальная переменная внутри функции, которая все еще имеет ссылку внутри анонимной функции. Вот мое решение, которое должно иллюстрировать то, о чем я говорю:
photos: function(){
var This = this;
var apiString = '/' + this.model.id + '/photos';
FB.api(apiString, function(response){
loadPhoto(response, 1, This.model);
});
Функция loadPhoto - это оболочка для загрузки изображения (я знаю, что позвоночник может помочь мне с загрузкой разных видов, но я решал одну проблему одновременно). Он принимает вызов api фотографии как модель, число как смещение и ответ origanl. Первая строка этой функции устанавливает эту локальную переменную This. Это позволяет мне внутри анонимной функции обратного вызова ссылаться на объект, из которого он был вызван.
Надеюсь, это может помочь кому-то, поскольку я провел много часов и много времени для тестирования, чтобы найти решение этого. Если вы не знаете, как работают обратные вызовы или закрытие, трудно найти нужную информацию.