Javascript не может установить значение переменной

Я пытаюсь заставить эту функцию установить значение sortedScores... всякий раз, когда я делаю console.log в любом месте, кажется, что значения сохраняются правильно, но на самом деле он не может правильно установить sortedScores...

function facebook(sortedfriends) {

        var myID;
        var access_token;
   FB.init({
        appId  : something,
            status : true,
            cookie : true,
            xfbml  : true,
   });

   FB.getLoginStatus(function(response, sortedfriends) {
           if(!response.session) {
               FB.login(function(response) {
                       myId = response.session.uid;
                       access_token = response.session.access_token;
                       //does stuff

                       if (!response.session) {
                           console.log('User cancelled login or did not fully authorize.');
                       }
                   });
           }
           else if(response.session) {
               myId = response.session.uid;
               access_token = response.session.access_token;
           var D = new Array();
               this.access_token = access_token;
               FB.api('/me/feed?access_token=' + access_token + '&limit=100', function(response, sortedfriends) {
               for( i=0; i<response.data.length; i++) {
                           var msg = response.data[i];
                           D.push(msg);
               }
                       sortedfriends = somefunction(D, myID);
                       //i know somefunction works because if i do console.log(sortedfriends) it shows me the right values...

               });

           }
   });
}

когда я пытаюсь найти друзей; фейсбук(друзья); друзья просто не определены... halp?


person Dave Zhang    schedule 23.08.2011    source источник
comment
Мне кажется, или опечатка halp встречается чаще, чем должна быть? Есть причина для этого?   -  person ChaosPandion    schedule 24.08.2011
comment
@ChaosPandion: google.se/   -  person Guffa    schedule 24.08.2011


Ответы (2)


Непонятно, где вы пытаетесь получить доступ к sortedfriends, но я предполагаю, что ваша проблема в том, что вход в Facebook является асинхронным, поэтому ответ приходит через некоторое время после завершения функции facebook. Таким образом, если вы пытаетесь использовать данные sortedfriends сразу после вызова функции facebook, данных еще не будет, потому что вызов входа в систему еще не завершен.

Единственный способ использовать данные sortedfriends — от обработчика успеха к вызову входа в систему (где ваш console.log уже проверяет наличие данных). Если вы хотите использовать его в другом коде, вызовите этот другой код из обработчика успеха в вызов входа в систему. Вы не можете вызвать этот код сразу после вызова функции facebook.

Эта логика не будет работать из-за асинхронного характера вызова входа в систему (он не завершен, когда вызов facebook возвращается, и выполнение продолжается после него:

var sortedfriends = [];
facebook(sortedfriends);
// use sortedfriends here

Вместо этого вы должны сделать этот тип структуры:

var sortedfriends = [];
facebook(sortedfriends);
// nothing executes here

И внутри вашего вызова facebook, где у вас есть это, добавьте вызов функции к любому коду, который вы хотите использовать для данных sortedfriends:

       else if(response.session) {
           myId = response.session.uid;
           access_token = response.session.access_token;
       var D = new Array();
           this.access_token = access_token;
           FB.api('/me/feed?access_token=' + access_token + '&limit=100', function(response, sortedfriends) {
           for( i=0; i<response.data.length; i++) {
                       var msg = response.data[i];
                       D.push(msg);
           }
                   sortedfriends = somefunction(D, myID);
                   //i know somefunction works because if i do console.log(sortedfriends) it shows me the right values...
                   // call the rest of your code here that will use sortedfriends
                   doSomethingWithSortedFriends(sortedfriends);

           });
person jfriend00    schedule 23.08.2011
comment
Большое спасибо, это сработает... но поскольку я работаю с партнером, это будет означать, что нам придется значительно перестроить остальную часть программы... ну ладно. Нет ли случайно другого способа? Если я удостоверюсь, что facebook полностью выполнен, могу ли я получить код, который выполняется после него? - person Dave Zhang; 24.08.2011
comment
Некоторые вызовы ajax можно сделать синхронными, но обычно это неудачное проектное решение, поскольку оно блокирует браузер во время сетевого вызова. Кроме того, это API Facebook, поэтому у вас, вероятно, даже нет такой возможности. Таким образом, вам просто придется реструктурировать код, чтобы отработать функцию завершения и ничего не делать после инициации вызова. Это просто жизнь асинхронных сетевых вызовов в javascript (или любом другом языке). Способ убедиться, что вызов facebook выполнен, - это обратный вызов успеха - лучшего способа нет. - person jfriend00; 24.08.2011

функции javascript не изменяют входящие ссылки. Вы не можете передать undefined и ожидать, что он будет определен после выполнения функции.

Вместо этого вы должны сделать sortedFriends глобальной переменной и не передавать ее в качестве параметра функции. Обратите внимание, что значение sortedFriends будет установлено после выполнения ajax-запроса внутри getLoginStatus, поэтому вы не сможете использовать его сразу после выполнения функции facebook.

person Michael Sagalovich    schedule 23.08.2011
comment
Это странно... поэтому мне нужна какая-то логика вроде if(!sortedfriends) sortedFriends = somefunction(D, myID)? Кроме того, сделайте sortedfriends глобальной переменной, чтобы инициализировать ее вне функции. - person Dave Zhang; 24.08.2011