Javascript не может установить значение переменной - PullRequest
0 голосов
/ 24 августа 2011

Я пытаюсь заставить эту функцию установить 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...

               });

           }
   });
}

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

Ответы [ 2 ]

2 голосов
/ 24 августа 2011

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

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

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

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

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

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

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

       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);

           });
0 голосов
/ 24 августа 2011

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

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

...