使函数返回带有对象的数组

时间:2013-10-26 01:25:16

标签: javascript arrays facebook facebook-graph-api object

我已经在这个角落里碰到了我的头,但我在这里错过了一些东西。

信息

我正在编写一个小的javascript页面,该页面会拍摄Facebook照片的照片ID,然后返回总人数以及分享它的人,然后在每张照片上找到喜欢的数量,并附上它随之而来。

基本上它是“计算共享喜欢”

到目前为止,我设法查询共享的总数,并在其上找到喜欢的内容,但是没有安排感,因为获取共享的FB.API函数与FB.API函数的请求不同会得到喜欢的。

目标

我一直在尝试做的是获取共享图片ID(我用它来获得总喜欢),人名,人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-数组我正在推动设置它的函数的OUTSIDE中的对象返回为空数组,即使我全局定义了数组。虽然console.log-ing在函数内部按预期方式返回。

2 - 我无法使用getLikes函数和查找共享函数的原因是因为它出现未定义或不匹配,我假设因为它有一个不同的FB.api调用并且需要几毫秒来查询和得到结果,JS决定其未定义。

3 - 由于目标是将所有格式都放在HTML格式中,我需要以一种很好的格式安排结果,以便我可以使用它而无需使用它。哪个是数组[object,object,object]

CODE

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

1 个答案:

答案 0 :(得分: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));
}