2013-10-26 5 views
0

Я ударил головой по всем углам с помощью этого, но мне что-то не хватает.Сделать функцию возвращать массив с объектами

информация

Я кодирование небольшого яваскрипта страницы, которая будет Сфотографируйте идентификатор Facebook фото, а затем вернуть общее число людей, и люди, которые разделяли его, а затем найти число нравится на каждой фотографии и прикладывает ее вместе с этим.

В основном это «Рассчитать Shared Нравится»

До сих пор мне удалось запросить общее количество акций, и найти подобные на них, но нет никакого смысла расположения, так как функция FB.API, которая получает акции - это другой запрос, чем функция FB.API, которая получит понравившиеся.

Цель

То, что я пытаюсь сделать, это получить общее изображение ID, (который я использую, чтобы получить общее количество подобных), имя лица, лица ID и толкать их в массив как объекты.

Какой из них я буду зацикливать массив и прикрепить количество понравившихся при проверке и убедиться, что эти имена принадлежат правильному идентификатору человека.

Так что мой окончательный массив данных будет выглядеть следующим образом:

[{"id" : "pageID_PostID", "name" : "Some Name", "idmin" : "This is the person ID", "likes" : "This is the total number of likes"}, {etc}, {etc}] 

Проблема

1-console.log-инга массив я толкающие объекты в ВНЕ функции, которые устанавливают его возвращается как пустой массив, хотя я определил массив глобально. Хотя console.log-ing внутри функции возвращается, как ожидалось.

2-Причина, почему я не могу использовать функцию getLikes вместе с функцией поиска акций, потому что она вышла либо как неопределенная, либо несогласованная, я предполагаю, что ее другой вызов FB.api занимает несколько миллисекунд для запроса и получить результаты, с помощью которых JS решает свои неопределенные.

3-Поскольку цель состоит в том, чтобы заложить все, отформатированные в HTML, мне нужно было бы упорядочить результат в хорошем формате для меня, чтобы работать без супа из него. Какой массив [объект, предмет, объект]

КОДА

var pageAccessToken; 
var shares = new Array(); 

function getShares(id){ 

FB.api('https://graph.facebook.com/' + id +'/sharedposts?access_token='+pageAccessToken, function(response) 
     { 
     for(var i = 0; i < response.data.length; i++) 
     { 
      if(response.data[i].story.indexOf('shared')){ 
       var shareID = response.data[i].id; 
       var pageID = response.data[i].from.id; 
       var shareObj = new Object(); 

       console.log(response.data[i].story); 
       console.log(" With Post ID " + shareID); 

       shareObj.id = response.data[i].id; 
       shareObj.name = response.data[i].from.name; 
       shareObj.idmin = response.data[i].from.id; 
       shareObj.likes = null; 

       shares.push(shareObj); 
      } //end if 
     } //end for loop 

     console.log(response.data.length + " People shared this photo."); 
     console.log("Inside call for shares array" + JSON.stringify(shares)); 
     return shares; //I don't really get how return works cause its not helping anywhere! 


     }); //end fb api 

} //end getShares 

//function to retrieve likes 
    function getLikes(pageID, idmin){ 
     FB.api('https://graph.facebook.com/' + pageID + '/likes?  summary=1&access_token='+pageAccessToken, function(response) 
     { 

     for (var i = 0; i < shares.length - 1; i++) { 
       shares[i].likes = response.summary['total_count']; 
       console.log(shares[i].name + " has " + shares[i].likes + " likes."); 
       console.log(response.summary['total_count']); 

     } 


    }); 
} 
//end getLikes 


    for (var i = 0; i < shares.length - 1; i++) { 
      getLikes(shares[i].id, shares[i].idmin); 
    } 

    getShares(insert a photo ID here); 
    console.log("2 Outside call for shares array" + JSON.stringify(shares)); 
+0

API-интерфейс является асинхронным, поэтому вход содержимое массива за пределами обратный вызов не покажет вам ничего. – Pointy

ответ

1

Поскольку функция FB.api является асинхронной и занимает некоторое время, чтобы ответить, вы должны принять асинхронный подход к вашей функции слишком , Вместо того, чтобы возвращать переменную shares, вы можете получить функцию как параметр в своей функции getShared и называть ее передачей shares в качестве параметра, когда вы готовы к работе. Вот простой пример:

function getShares(id, callback) { 
    FB.api('https://graph.facebook.com/' + id +'/sharedposts?access_token='+pageAccessToken, function(response) { 
     // ...do something with the response and store the result in a variable called shares... 

     callback(shares); // calls the function passed as argument passing "shares" as parameter 
    } 
} 

Тогда вы можете вызвать getShares передавая функцию в качестве параметра с тем, что вы хотите сделать с результатом:

getShares(some_id, function(shares) { 
    alert('shares: ' + JSON.stringify(shares)); 
} 
+0

Спасибо, теперь он работает лучше, нужно еще больше расширить понимание функций обратного вызова и асинхронного доступа! – Ether

Смежные вопросы