0

私はこれで隅々まで頭を悩ませましたが、ここで何かが欠けています.

情報

Facebookの写真の写真IDを取得し、合計人数とそれを共有した人を返し、各写真のいいねの数を見つけて、それと一緒に添付する小さなJavaScriptページをコーディングしています.

基本的には「共有いいね数の計算」です

これまでのところ、シェアの総数を照会していいね! を見つけることができましたが、シェアを取得する FB.API 関数と、好き。

ゴール

私がやろうとしているのは、共有イメージ ID (いいね! の総数を取得するために使用します)、人物の名前、人物 ID を取得し、それらをオブジェクトとして配列にプッシュすることです。

次に、配列を for ループして、いいね! の数をアタッチし、いいね! が正しい人物 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-ingする 配列をグローバルに定義したにもかかわらず、設定した関数の外側にオブジェクトをプッシュしていますが、空の配列として返されます。関数内で 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));
4

1 に答える 1

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));
}
于 2013-10-26T01:35:02.917 に答える