mixiアプリに限らずjavascriptを利用したwebプログラムには共通の事だと思いますが
下記のようなプログラムを書いたとき、想定した結果を得られません。
<script type="text/javascript">
var name_from_getname;//グローバル変数
function getname() {
var req = opensocial.newDataRequest();
req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer");
req.send(function(data) {
var viewer = data.get("viewer").getData();
name_from_getname = viewer.getDisplayName();
alert(name_from_getname + ":alert from getname");
});
}
function init(){
getname();
alert(name_from_getname);
}
gadgets.util.registerOnLoadHandler(init);
</script>
init()からgetname()を呼び出し、この中でグローバル変数name_from_getnameにユーザ名を代入します。
この処理が終わったらalertでユーザ名を出力するのですが、実行すると、
"undefind"
"ユーザ名:alert from getname"
の順番にアラートが表示されます。
つまりgetname()の文法は間違っておらず、処理される順番が入れ違ってしまっているという事です。
本件の原因と対処法をご存知の方、ご教示下さい。
できればinit()の中身をいじらずに対応できると嬉しいです。
また、ソースを記載していただくと助かります。
opensocial.newDataRequest は、XMLHTTPRequest を使って実装されていると想像できますが、
この手の実装では、非同期にリクエストを処理します。
つまり、Webサーバにリクエストは出すけど、その応答を待たずにメソッドが終了する、ということです。
データを取得した後に何かの処理をしたいのであれば、req.send に書いてある function の中に処理を書きます。
つまり、init() の中の getname() の後に書きたい処理があるなら、
req.send() で指定する関数の中に書く必要があります。
function getname() { var req = opensocial.newDataRequest(); req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer"); req.send(function(data) { var viewer = data.get("viewer").getData(); name_from_getname = viewer.getDisplayName(); ★ここに書く }); } function init(){ getname(); ☆ここじゃない }