Amazon

2011年3月6日日曜日

OpenSocialにおける複数のfriend情報取得方法

OpenSocialアプリケーションで、すでにIDがわかっている複数ユーザーのニックネームやサムネイルURL、プロフィールURLを取得する際にハマッたのでメモしておきます。

もともとやろうとしていたコードが以下。friendIDListは詳細情報を取得したいIDの配列。
function multiFriendRequest(friendIDList){
    for (var i = 0; i < friendIDList.length; i++) {
        var friendID = friendIDList[i];
        var params = {};
        params[opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS] = [opensocial.Person.Field.PROFILE_URL];
        var req = opensocial.newDataRequest();
        req.add(req.newFetchPersonRequest(friendID), "request");
        req.send(function(data){
                var viewer = data.get("request").getData();
                var name = viewer.getDisplayName();
                var url = viewer.getField(opensocial.Person.Field.THUMBNAIL_URL);
                var purl = viewer.getField(opensocial.Person.Field.PROFILE_URL);
                var html = "<a href=\"" + purl + "\" >" + name + "<br><img src=\"" + url + "\" \/><\/a>";
                document.getElementById("friend" + i).innerHTML = html;
            }
        });  
    }    
}
For文の中にrequestを入れて、複数回リクエストをしようとしたのだが、全てのリクエスト結果がiが最後の値で返ってきた。
たとえば、friendIDList=["friend1","friend2"]
だった場合
friend1
friend2
ではなく
friend2
friend2
となるのだ。

む。。。困ったぞ。
いろいろOpenSocial系のドキュメントを探していたら、リクエストの種類を複数にして1回の問い合わせにする方法が上手くいきそうな感触をつかむ。

そこで直したコードが以下。

funcation multiFriendRequest(friendIDList){
    var params = {};
    params[opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS] = [opensocial.Person.Field.PROFILE_URL];
    var req = opensocial.newDataRequest();
    
    for (var i = 0; i < friendIDList.length; i++) {
         req.add(req.newFetchPersonRequest(friendIDList[i]), "request" + i);
    }
    
    req.send(function(data){
        for (var j = 0; j < friendIDList.length; j++) {
            var viewer = data.get("request" + j).getData();
            var name = viewer.getDisplayName();
            var url = viewer.getField(opensocial.Person.Field.THUMBNAIL_URL);
            var purl = viewer.getField(opensocial.Person.Field.PROFILE_URL);
            var html = "<a href=\"" + purl + "\" >" + name + "<br><img src=\"" + url + "\" \/><\/a>";
            document.getElementById("friend" + j).innerHTML = html;
        }
    });
}

という感じに
req.addで複数人の友達情報のリクエストを格納して一度にリクエストを投げる。とうまくいく。

確かにコード実行速度とAPIリクエストのタイミングは随分差があるのと、そんなに無駄にリクエストするのを防ぐために一回にまとめる方法はスマートですね。

【参考】 
Opensocial入門を読んで見た(第五章)

0 件のコメント:

コメントを投稿

Amazon3